好的,所以我正在学习泛型,我正试图让这个东西运行,但它一直在说我同样的错误。这是代码:
public static T Test<T>(MyClass myClass) where T : MyClass2
{
var result = default(T);
var resultType = typeof(T);
var fromClass = myClass.GetType();
var toProperties = resultType.GetProperties();
foreach (var propertyInfo in toProperties)
{
var fromProperty = fromClass.GetProperty(propertyInfo.Name);
if (fromProperty != null)
propertyInfo.SetValue(result, fromProperty, null );
}
return result;
}
答案 0 :(得分:8)
这是因为default(T)
返回null
,因为T
表示引用类型。引用类型的默认值为null
。
您可以将方法更改为:
public static T Test<T>(MyClass myClass) where T : MyClass2, new()
{
var result = new T();
...
}
然后它会按你的意愿工作。当然,MyClass2
及其后代现在必须有一个无参数构造函数。
答案 1 :(得分:3)
这里的问题是T
派生自MyClass
,因此是引用类型。因此,表达式default(T)
将返回值null
。以下对SetValue的调用是运行null
值,但该属性是实例属性,因此您获得指定的消息。
您需要执行以下操作之一
T
的实际实例传递给Test函数以在答案 2 :(得分:1)
而不是
propertyInfo.SetValue(result, fromProperty, null);
尝试:
foreach (var propertyInfo in toProperties)
{
propertyInfo.GetSetMethod().Invoke(MyClass2, new object[]
{
MyClass.GetType().GetProperty(propertyInfo.Name).
GetGetMethod().Invoke(MyClass, null)
});
}