【发布时间】:2021-01-09 23:45:26
【问题描述】:
我正在尝试初始化对象以进行测试。初始化对象后,我想断言其基础类型是值类型的所有属性的值都不是属性类型的默认值,但有某些例外。我不想递归到子对象。为此,我有以下内容:
public static void NoValueTypedPropertyHasDefaultValue<T>(this T t, params string[] exceptions)
where T: class
{
foreach (var property in typeof(T).GetProperties())
{
var propertyType = property.PropertyType;
if (propertyType.IsValueType && !exceptions.Any(x => x == property.Name))
{
var defaultValue = Activator.CreateInstance(propertyType);
object actualValue = property.GetValue(t);
Assert.NotEqual(defaultValue, actualValue);
}
}
}
只要一切都有一个无参数的构造函数,它就可以工作。我对为异常传递字符串的方式并不感到兴奋。有没有更好的方法来做到这一点?
【问题讨论】:
-
定义:更好。听起来很固执。
-
我不高兴调用者可以只输入字符串,在这种情况下,它无法在属性重命名后继续存在。
-
我可能会将
exceptions重命名为propertiesToIngnore,异常对我来说意味着各种运行时错误异常。然后将它们从字符串更改为PropertyInfo对象 -
嗯,
typeof(MyObject).GetProperty(nameof(MyObject.PropertyName)))似乎是创建 PropertyInfo 对象的方法?不确定我喜欢那个。绝对喜欢 propertiesToIgnore。 -
您提到:“前提是一切都有一个无参数的构造函数”。您无需担心 - 因为您已经在过滤值类型(
propertyType.IsValueType,并且“不尝试递归到子对象”),Activator.CreateInstance可以正常工作。但请注意,string不是值类型,因此您将跳过任何字符串属性。
标签: c# reflection properties