7

変数でプロパティ名を参照する方法はありますか?

シナリオ:オブジェクトAにはパブリック整数プロパティX a Zがあるため、...

public void setProperty(int index, int value)
{
    string property = "";

    if (index == 1)
    {
        // set the property X with 'value'
        property = "X";
    }
    else 
    {
        // set the property Z with 'value'
        property = "Z";
    }

    A.{property} = value;
}

これはばかげた例なので、信じてください、私はこれを使用しています。

4

4 に答える 4

31

簡単:

a.GetType().GetProperty("X").SetValue(a, value);

typeに「X」という名前のプロパティがない場合にGetProperty("X")戻ることに注意してください。nulla

提供した構文でプロパティを設定するには、拡張メソッドを記述します。

public static class Extensions
{
    public static void SetProperty(this object obj, string propertyName, object value)
    {
        var propertyInfo = obj.GetType().GetProperty(propertyName);
        if (propertyInfo == null) return;
        propertyInfo.SetValue(obj, value);
    }
}

そして、次のように使用します。

a.SetProperty(propertyName, value);

UPD

この反射ベースの方法は比較的遅いことに注意してください。パフォーマンスを向上させるには、動的コード生成または式ツリーを使用します。この複雑なことをあなたに代わって行うことができる優れたライブラリがあります。たとえば、FastMember

于 2012-11-08T15:31:28.940 に答える
5

私はあなたが反射を意味すると思います:

PropertyInfo info = myObject.GetType().GetProperty("NameOfProperty");
info.SetValue(myObject, myValue);
于 2012-11-08T15:30:39.047 に答える
4

あなたの提案の方法ではありませんが、はい、それは実行可能です。dynamicオブジェクト(またはプロパティインデクサーを持つオブジェクト)を使用できます。例:

string property = index == 1 ? "X" : "Z";
A[property] = value;

または、Reflectionを使用して:

string property = index == 1 ? "X" : "Z";
return A.GetType().GetProperty(property).SetValue(A, value);
于 2012-11-08T15:32:01.263 に答える
0

あなたが何を達成しようとしているのか理解するのは難しいです...プロパティと値を別々に決定しようとしている場合、そして異なる時間に、デリゲート内にプロパティを設定する行為をラップすることができます。

public void setProperty(int index, int value)
{
    Action<int> setValue;

    if (index == 1)
    {
        // set property X
        setValue = x => A.X = x;
    }
    else
    {
        // set property Z
        setValue = z => A.Z = z;
    }

    setValue(value);
}
于 2012-11-08T15:45:17.027 に答える