リフレクションを使用して動的にプロパティを実際の型にキャストする

c# entity-framework reflection

質問

プロパティを実際の型に動的にキャストする必要があります。どうやって/私はリフレクションを使ってこれをすることができますか?

私が少し取り組んでいる本当のシナリオを説明するために。 Entity Frameworkプロパティの "First"拡張メソッドを呼び出そうとしています。 Frameworkコンテキストオブジェクトで呼び出される特定のプロパティは、文字列としてメソッドに渡されます(取得するレコードのIDも)。だから私はFirstメソッドを呼び出すためにオブジェクトの実際の型が必要です。

ラムダまたはデリゲートメソッドはプロパティにアクセスするためにオブジェクトの実際の型を必要とするので、オブジェクトの "Where"メソッドを使用することはできません。

また、オブジェクトはEntity Frameworkによって生成されるので、その型をインターフェイスにキャストして操作することはできません。

これはシナリオコードです。

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

受け入れられた回答

しばらく時間があったので、VS2010を使用して問題を解決しようとしましたが、動的キーワークが私の質問を「解決する」と思っていたときには、私は以前にいたと思います。以下のコードを見てください。

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

人気のある回答

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

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ