1

object.GetType()。GetProperty(string propertyName)を使用して、リフレクションを介してプロパティを再帰的に評価しています。

これは、objが封印されたクラスであるが、通常のパブリッククラスのオブジェクトとしてプロパティを持っている場合に正常に機能します。ただし、このプロパティに封印されたクラスオブジェクトが含まれている場合、GetProperty()メソッドを介してプロパティを返すことはありません。

Prpty1->Prpty2->Prpty3を介してBaseclassオブジェクトから再帰的に反復しようとしています。param.Propertiesには、Prpty1、Prpty2、Prpty3の文字列配列が含まれています。Prpty2を取得できません。Nullとして表示されます。このアクセスのために以下に書かれた方法を使用します。

サンプルコードは次のとおりです。

//Methods below are used to extract value from Object (basically BaseClass Object)

 private string EvaluateObject(object obj, MappedParameter param)
    {
        object evaluatedObj = obj;
        foreach (string s in param.Properties)
        {
            evaluatedObj = EvalProperty(evaluatedObj, s);
        }
        return (evaluatedObj == obj ? null : evaluatedObj.ToString());
    }

    private object EvalProperty(object obj, string propertyName)
    {
        System.Reflection.PropertyInfo propInfo = obj.GetType().GetProperty(propertyName);
        if (propInfo == null)
            throw new Exception("Invalid Property token");
        object propertyValue = propInfo.GetValue(obj, null);
        return propertyValue;
    }


//Below classes are Data Wrappers

 namespace TryClassLibrary
 {
 public class BaseClass
 {
    private NestedClass _Data = new NestedClass();    

    public NestedClass Prpty1
    {
        set { _Data = value; }
        get { return _Data; }
    }
}
}

 namespace TryClassLibrary
{
public sealed class NestedClass
{
    public int Id { get; set; }

    public NestedNestedClass Prpty2 = new NestedNestedClass();
}

public sealed class NestedNestedClass
{
    private string _Message;

    public NestedNestedClass()
    {
        Prpty3 = "Test value";
    }

    public string Prpty3
    {
        set
        {
            _Message = value;
        }
        get { return _Message; }
    }
}
}

誰かがPrpty2、Prpty3にアクセスする方法を見つけるのを手伝ってくれませんか、それともリフレクションを使用する際の既存の制約ですか。ありがとう。

4

1 に答える 1

2

ああ、問題は単純です:Prpty2 プロパティではありません:フィールドです:

public NestedNestedClass Prpty2 = new NestedNestedClass();

する必要があります:

private readonly NestedNestedClass prpty2 = new NestedNestedClass();
public NestedNestedClass Prpty2 { get { return prpty2; } }

(または類似)

その後、すべてが機能します。

object obj = new BaseClass();
obj = obj.GetType().GetProperty("Prpty1").GetValue(obj, null);
obj = obj.GetType().GetProperty("Prpty2").GetValue(obj, null);
obj = obj.GetType().GetProperty("Prpty3").GetValue(obj, null);
string s = obj.ToString(); // "Test value"

詳細については、これをたくさん行っている場合は、FastMemberを見てください。それはより便利で、反射税を支払わないように大幅に最適化されています。

于 2012-06-13T07:33:31.000 に答える