Wandeln Sie eine Eigenschaft mithilfe von Reflektionen dynamisch in ihren tatsächlichen Typ um

c# entity-framework reflection

Frage

Ich muss eine Eigenschaft dynamisch in ihren tatsächlichen Typ umwandeln. Wie kann / kann ich dies mit Reflektion tun?

Um das wirkliche Szenario zu erklären, an dem ich gerade arbeite. Ich versuche, die Erweiterungsmethode "First" für eine Entity Framework-Eigenschaft aufzurufen. Die spezifische Eigenschaft, die für das Framework-Kontextobjekt aufgerufen werden soll, wird als Zeichenfolge an die Methode übergeben (sowie die ID des abzurufenden Datensatzes). Ich brauche also den tatsächlichen Typ des Objekts, um die First-Methode aufzurufen.

Ich kann die "Where" -Methode nicht für das Objekt verwenden, da die Lambda- oder Delegat-Methode immer noch den tatsächlichen Typ des Objekts benötigt, um auf die Eigenschaften zuzugreifen.

Da das Objekt vom Entity Framework generiert wird, kann ich den Typ nicht in eine Schnittstelle umwandeln und damit umgehen.

Dies ist Szenario-Code:

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
        }
    }
}

Akzeptierte Antwort

Ich hatte einige Zeit, also habe ich versucht, mein Problem mit VS2010 zu lösen, und ich glaube, ich hatte recht, als ich daran dachte, dass das dynamische Keywork meine Frage 'lösen' würde. Siehe den Code unten.

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; 
        }
    }
}

Beliebte Antwort

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);  }


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum