6 votes

Comment connaître le type d'une propriété s'il s'agit d'une collection dans Reflection ?

List<MyClass> MyClassPro
{
   get;set;
}

MyClass obj = new MyClass();

obj.MyClassPro = null;

Considérons que MyClassPro est null. Dans le cas de Reflection, je ne connaîtrai pas le nom de la classe ou de la propriété.

Si j'essaie d'obtenir le type de propriété en utilisant GetType comme ,

      Type t = obj.GetType();

Il renvoie "System.Collections.Generic.list". Mais je m'attends à ce que le type soit MyClass.

J'ai également essayé la méthode suivante

        foreach(PropertyInfo propertyInfo in obj.GetProperties())
        {
             if(propertyInfo.IsGenericType)
             {
              Type t = propertyInfo.GetValue(obj,null).GetType().GetGenericArguments().First();
             }
        }

Mais il renvoie une erreur car la valeur de la propriété de la collection est nulle et nous ne pouvons donc pas obtenir le type.

Dans cette situation, comment puis-je obtenir le type d'une propriété de collection.

Aidez-moi !

Merci d'avance.

11voto

Chaquotay Points 1277

Utilisation propertyInfo.PropertyType au lieu de propertyInfo.GetValue(obj,null).GetType() qui devrait vous donner le type de propriété même si la valeur de la propriété est null .

Ainsi, lorsque vous avez une classe comme

public class Foo {
    public List<string> MyProperty { get; set; }
}

et une instance de Foo en obj alors

var propertyInfo = obj.GetType().GetProperty("MyProperty"); // or find it in a loop like in your own example
var typeArg = propertyInfo.PropertyType.GetGenericArguments()[0];

vous donnera la valeur System.String (en tant que System.Type instance) en typeArg .

6voto

hashi Points 1012

Utilisation propertyInfo.PropertyType qui possède une propriété dont le nom est IsGenericType , par exemple :

if (propertyInfo.PropertyType.IsGenericType)
{
    // code ...
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X