非静态方法需要PropertyInfo.SetValue中的目标

时间:2010-08-26 16:49:05

标签: c# visual-studio generics propertyinfo setvalue

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

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

3 个答案:

答案 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值,但该属性是实例属性,因此您获得指定的消息。

您需要执行以下操作之一

  1. T的实际实例传递给Test函数以在
  2. 上设置属性值
  3. 仅在类型
  4. 上设置静态属性

答案 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)
    });
}