2010-08-26 7 views
5

Ok, also lerne ich über Generika und ich versuche, dieses Ding laufen zu lassen, aber es hält mich den gleichen Fehler. Hier ist der Code:Nicht-statische Methode erfordert ein Ziel in 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; 
} 

Antwort

8

Dies passiert, weil default(T)null zurückgibt, weil T einen Referenztyp darstellt. Standardwerte für Referenztypen sind null.

Sie könnten Ihre Methode ändern:

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

und dann wird es funktionieren, wie Sie es wollen. Natürlich müssen MyClass2 und seine Nachkommen jetzt einen parameterlosen Konstruktor haben.

+0

Danke, das war genau das, was ich gesucht habe ... –

3

Das Problem hierbei ist, dass T von MyClass ableitet und ist daher ein Referenztyp. Daher gibt der Ausdruck default(T) den Wert null zurück. Der folgende Aufruf von SetValue führt einen null-Wert, aber die Eigenschaft ist eine Instanzeigenschaft, daher erhalten Sie die angegebene Nachricht.

Sie werden eine der folgenden

  1. tun müssen, eine echte Instanz T auf die Testfunktion Pass setzen stellen Sie die Eigenschaftswerte auf
  2. nur die statischen Eigenschaften von der Art
1

Statt

propertyInfo.SetValue(result, fromProperty, null); 

Versuch:

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