5

好的,所以我正在学习泛型,我正在尝试让这个东西运行,但它一直告诉我同样的错误。这是代码:

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;
}
4

3 回答 3

9

发生这种情况是因为default(T)返回null因为T表示引用类型。引用类型的默认值为null.

您可以将方法更改为:

public static T Test<T>(MyClass myClass) where T : MyClass2, new()
{
    var result = new T();
    ...
}

然后它将按您的意愿工作。当然,MyClass2它的后代现在必须有一个无参数的构造函数。

于 2010-08-26T16:54:06.823 回答
3

这里的问题是它T派生自MyClass引用类型,因此是引用类型。所以表达式default(T)将返回值null。以下对 SetValue 的调用正在操作一个null值,但该属性是一个实例属性,因此您会收到指定的消息。

您需要执行以下操作之一

  1. 将 的真实实例传递T给 Test 函数以设置属性值
  2. 仅在类型上设置静态属性
于 2010-08-26T16:53:18.633 回答
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)
    });
}
于 2011-09-01T20:28:21.347 回答