3

FastMember を使用してネストされたメンバー プロパティを設定しようとすると、例外が発生します。たとえば、これらのクラスがある場合

public class A
{
    public B First { get; set; }
}

public class B
{
    public string Second { get; set; }
}

First.Secondにインスタンスを設定したい"hello"

var b = new B{ Second = "some value here" };
var a = new A{ First = b };
var accessor = ObjectAccessor.Create(a);
accessor["First.Second"] = value; // this does not work and gives ArgumentOutOfRangeException

この時点で深さが分からないので、["First"]["Second"] に分割することはできません。ネストされたプロパティへの魔法のアクセスはありますか、それとも自分で階層を分割する必要がありますか?

4

3 に答える 3

3

このように拡張メソッドを使用して問題を再帰的に解決しました。

public static class FastMemberExtensions
{
    public static void AssignValueToProperty(this ObjectAccessor accessor, string propertyName, object value)
    {
        var index = propertyName.IndexOf('.');

        if (index == -1)
        {
            accessor[propertyName] = value;
        }
        else
        {
            accessor = ObjectAccessor.Create(accessor[propertyName.Substring(0, index)]);
            AssignValueToProperty(accessor, propertyName.Substring(index + 1), value);
        }
    }        
}

...そして、これは次のように開始されます。

ObjectAccessor.Create(a).AssignValueToProperty("First.Second", "hello")
于 2016-10-28T13:58:39.187 に答える
2

複数の ObjectAccessor インスタンスを使用してオブジェクト グラフをトラバースする必要があります。

public static void UseFastMember()
{
    var b = new B { Second = "some value here" };
    var a = new A { First = b };
    var value = "hello";
    var a_accessor = ObjectAccessor.Create(a);
    var first = a_accessor["First"];
    var b_accessor = ObjectAccessor.Create(first);
    b_accessor["Second"] = value;
}
于 2016-10-28T13:14:24.133 に答える