web-dev-qa-db-ja.com

プロパティ名で動的にプロパティ値にアクセスするC#

私が解決しようとしている問題は、プロパティ名を文字列として受け取り、そのプロパティに割り当てられた値を返すメソッドを作成する方法です。

私のモデルクラスは次のように宣言されています:

public class Foo
{
    public int FooId
    public int param1
    public double param2
}

そして私の方法の中から私はこれに似た何かをしたいです

var property = GetProperty("param1)
var property2 = GetProperty("param2")

私は現在、次のような式を使用してこれを実行しようとしています。

public dynamic GetProperty(string _propertyName)
    {
        var currentVariables = m_context.Foo.OrderByDescending(x => x.FooId).FirstOrDefault();

        var parameter = Expression.Parameter(typeof(Foo), "Foo");
        var property = Expression.Property(parameter, _propertyName);

        var lambda = Expression.Lambda<Func<GlobalVariableSet, bool>>(parameter);

    }

このアプローチは正しいですか?もしそうなら、これを動的型として返すことは可能ですか?

答えは正しかった、これはあまりにも複雑になっていた。解決策は次のとおりです。

public dynamic GetProperty(string _propertyName)
{
    var currentVariables = m_context.Foo.OrderByDescending(g => g.FooId).FirstOrDefault();

    return currentVariables.GetType().GetProperty(_propertyName).GetValue(currentVariables, null);
}
14
Thewads
public static object ReflectPropertyValue(object source, string property)
{
     return source.GetType().GetProperty(property).GetValue(source, null);
}
26

あなたはあなたが提供するサンプルで船外に行きます。

あなたが探している方法:

public static object GetPropValue( object target, string propName )
 {
     return target.GetType().GetProperty( propName ).GetValue(target, null);
 }

しかし、「var」と「dynamic」と「Expression」と「Lambda」を使用すると、6か月後にこのコードで迷子になることになります。それを書くより簡単な方法に固執する

6
Sten Petrov