2016-10-28 3 views
3

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

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

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

を持って、私は "hello"にインスタンスの First.Secondを設定したいとき。私はこの時点で深さを知らないので

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 

私は[「ファースト」] [「セカンド」]にそれを分割することはできません。ネストされたプロパティのための魔法のアクセスがありますか、自分自身を分割する必要がありますか?

答えて

1

複数の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; 
} 
+0

を、情報をありがとうすでに組み込みソリューションがあるかもしれないと思いました。今使っている再帰関数を投稿しました。どのようにnullable型の問題を解決するためのアイデアですか?それはここでの質問です:http://stackoverflow.com/questions/40306591/assign-value-to-nullablet-using-fastmember – Beachwalker

2

私は再帰的に拡張メソッドをこのように使用して問題を解決:

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") 
+0

注意してください、これは型変換に取り組んでいません。 ;-) – Beachwalker

+1

ですが、あなたの答えはhttp://stackoverflow.com/a/40364078/492です。ありがとうございます。 –

1

帽子を@Beachwalkerを切るためにインスピレーション。しかし、あなたは、これは私が持つ多くの成功持っていた拡張メソッドであるObjectAccessorとは対照的に、TypeAccessorを使用する必要があります。

public static class TypeAccessorExtensions 
{ 
    public static void AssignValue<T>(this TypeAccessor accessor, T t, MemberSet members, string fieldName, object fieldValue) 
    { 
     var index = fieldName.IndexOf('.'); 

     if (index == -1) 
     { 
      if (members.Any(m => string.Equals(m.Name, fieldName, StringComparison.OrdinalIgnoreCase))) 
       accessor[t, fieldName] = fieldValue; 
     } 
     else 
     { 
      string fieldNameNested = fieldName.Substring(0, index); 
      var member = members.FirstOrDefault(m => string.Equals(m.Name, fieldNameNested, StringComparison.OrdinalIgnoreCase)); 

      if (member != null) 
      { 
       var nestedAccesor = TypeAccessor.Create(member.Type); 
       var tNested = accessor[t, fieldNameNested]; 

       if (tNested == null) 
       { 
        tNested = Activator.CreateInstance(member.Type); 
        accessor[t, fieldNameNested] = tNested; 
       } 

       nestedAccesor.AssignValue(tNested, nestedAccesor.GetMembers(), fieldName.Substring(index + 1), fieldValue); 
      } 

     } 
    } 
} 
+1

私はこの質問を誰にも聞いたことがあります。なぜなら、私はこの問題を解決したその時に誰も答えてくれなかったからです。しかし、帽子のおかげで。 ;-) – Beachwalker

+1

heheはそれを見た! "自己参加"を愛する(それは不自由だった) - どちらかというと素晴らしい作品! – pimbrouwers

関連する問題