我想初始化所有泛型类型的公共属性。
我写了下面的方法:
public static void EmptyModel<T>(ref T model) where T : new()
{
foreach (PropertyInfo property in typeof(T).GetProperties())
{
Type myType = property.GetType().MakeGenericType();
property.SetValue(Activator.CreateInstance(myType));//Compile error
}
}
但是有编译错误
我该怎么做?
这里有三个问题:
-
PropertyInfo.SetValue
有两个参数,一个是用于设置属性的对象的引用(或者用于静态属性的null
),另一个是用于设置属性的值。 -
property.GetType()
将返回PropertyInfo
。要获取属性本身的类型,您需要使用property.PropertyType
。 - 你的代码不能处理在属性类型上没有无参数构造函数的情况。如果不从根本上改变你做事的方式,你就不能太花哨,所以在我的代码中,如果没有找到无参数构造函数,我将把属性初始化为
null
。
我想你要找的是这个:
public static T EmptyModel<T>(ref T model) where T : new()
{
foreach (PropertyInfo property in typeof(T).GetProperties())
{
Type myType = property.PropertyType;
var constructor = myType.GetConstructor(Type.EmptyTypes);
if (constructor != null)
{
// will initialize to a new copy of property type
property.SetValue(model, constructor.Invoke(null));
// or property.SetValue(model, Activator.CreateInstance(myType));
}
else
{
// will initialize to the default value of property type
property.SetValue(model, null);
}
}
}