2010-08-26 21 views
5

'da bir hedef gerektirir Tamam, bu yüzden generikleri öğreniyorum ve bu şeyi çalıştırmaya çalışıyorum, ama aynı hatayı söylemeye devam et. İşte kod: BuradaStatik olmayan yöntem 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; 
} 

cevap

8

Bu, default(T)null döndürdüğü için olur, çünkü T bir referans türünü temsil eder. Referans türleri için varsayılan değerler null'dur.

Bu hizmeti kullanmak için yöntem değişebilir:

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

ve siz istediğiniz kadar o zaman çalışacaktır. Tabii ki, MyClass2 ve onun torunları şimdi bir parametresiz kurucu olmalıdır. Bunun yerine

propertyInfo.SetValue(result, fromProperty, null); 

try

+0

teşekkür, ben arıyordum sadece ne ... –

3

sorun TMyClass kaynaklanmaktadır ve dolayısıyla bir başvuru türü olmasıdır. Yani default(T) ifadesi null değerini döndürecektir. Aşağıdaki SetValue çağrısı bir null değerini kullanıyor, ancak özellik bir örnek özelliğidir, dolayısıyla belirtilen iletiyi alırsınız.

Sadece tipine statik özellikleri ayarlamak

  • mülkiyet değerleri ayarlamak için Test fonksiyonuna T gerçek örneğini iletin aşağıdaki

    1. birini yapmanız gerekir
  • 1

    :

    foreach (var propertyInfo in toProperties) 
    { 
        propertyInfo.GetSetMethod().Invoke(MyClass2, new object[] 
        { 
         MyClass.GetType().GetProperty(propertyInfo.Name). 
         GetGetMethod().Invoke(MyClass, null) 
        }); 
    }