Transforme une propriété à son type actuel de manière dynamique à l'aide de la réflexion

c# entity-framework reflection

Question

Je dois lancer dynamiquement une propriété sur son type actuel. Comment puis-je / puis-je faire cela en utilisant la réflexion?

Pour expliquer le scénario réel sur lequel je travaille un peu. J'essaie d'appeler la méthode "First" extension sur une propriété Entity Framework. La propriété spécifique à appeler sur l'objet de contexte Framework est transmise à la méthode sous forme de chaîne (ainsi que l'identifiant de l'enregistrement à extraire). J'ai donc besoin du type réel de l'objet pour appeler la méthode First.

Je ne peux pas utiliser la méthode "Where" sur l'objet car la méthode lambda ou déléguée a toujours besoin du type réel de l'objet pour accéder aux propriétés.

De plus, comme l'objet est généré par Entity Framework, je ne peux pas transtyper le type sur une interface et opérer sur celle-ci.

C'est le code du scénario:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Reflection;

namespace NmSpc
{

    public class ClassA
    {
        public int IntProperty { get; set; }
    }

    public class ClassB
    {
        public ClassA MyProperty { get; set; }
    }

    public class ClassC
    {
        static void Main(string[] args)
        {
            ClassB tester = new ClassB();

            PropertyInfo propInfo = typeof(ClassB).GetProperty("MyProperty");
            //get a type unsafe reference to ClassB`s property
            Object property = propInfo.GetValue(tester, null);

            //get the type safe reference to the property
            ClassA typeSafeProperty = property as ClassA;

            //I need to cast the property to its actual type dynamically. How do I/Can I do this using reflection?
            //I will not know that "property" is of ClassA apart from at runtime
        }
    }
}

Réponse acceptée

J'avais un peu de temps alors j'ai essayé de résoudre mon problème en utilisant VS2010 et je pense avoir déjà raison lorsque je pensais que le travail de clé dynamique «résoudrait» ma question. Voir le code ci-dessous.

using System.Reflection;

namespace TempTest
{
    public class ClassA
    {
        public int IntProperty { get; set; }
    }

    public class ClassB
    {
        public ClassB()
        {
            MyProperty = new ClassA { IntProperty = 4 };
        }
        public ClassA MyProperty { get; set; }
    }

    public class Program
    {
        static void Main(string[] args)
        {
            ClassB tester = new ClassB();

            PropertyInfo propInfo = typeof(ClassB).GetProperty("MyProperty");
            //get a type unsafe reference to ClassB`s property
            dynamic property = propInfo.GetValue(tester, null);

            //casted the property to its actual type dynamically
            int result = property.IntProperty; 
        }
    }
}

Réponse populaire

public object CastPropertyValue(PropertyInfo property, string value) { 
if (property == null || String.IsNullOrEmpty(value))
    return null;
if (property.PropertyType.IsEnum)
{
    Type enumType = property.PropertyType;
    if (Enum.IsDefined(enumType, value))
        return Enum.Parse(enumType, value);
}
if (property.PropertyType == typeof(bool))
    return value == "1" || value == "true" || value == "on" || value == "checked";
else if (property.PropertyType == typeof(Uri))
    return new Uri(Convert.ToString(value));
else
    return Convert.ChangeType(value, property.PropertyType);  }


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow