2010-08-26 8 views
5

Ok, donc j'apprends des génériques et j'essaye de faire fonctionner cette chose, mais elle continue à me dire la même erreur. Voici le code:La méthode non statique nécessite une cible dans 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; 
} 

Répondre

8

Cela se produit car default(T) renvoie null car T représente un type de référence. Les valeurs par défaut pour les types de référence sont null.

Vous pouvez changer votre méthode pour:

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

et il fonctionnera comme vous le souhaitez. Bien sûr, MyClass2 et ses descendants doivent maintenant avoir un constructeur sans paramètre.

+0

Merci, c'était exactement ce que je cherchais ... –

3

Le problème ici est que T dérive de MyClass et est donc un type de référence. Ainsi, l'expression default(T) renverra la valeur null. L'appel suivant à SetValue exécute une valeur null mais la propriété est une propriété d'instance, donc vous obtenez le message spécifié.

Vous devez faire une des opérations suivantes

  1. Passer une véritable instance de T à la fonction de test pour définir les valeurs de propriété sur
  2. mis Seules les propriétés statiques du type
1

Au lieu de

propertyInfo.SetValue(result, fromProperty, null); 

essayer:

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