2016-10-28 47 views
3

我嘗試使用FastMember設置嵌套成員屬性時出現異常。有例如,當這些類如何使用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 

我不能把它分成[「第一」] [「第二」],因爲我不知道這一點的深度。有嵌套屬性的神奇訪問嗎?還是我必須自己拆分層次結構?

回答

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

感謝你的信息,認爲有可能是已經內置的解決方案。我發佈了我現在使用的遞歸函數。任何想法如何解決可空類型的問題?這是這裏的問題: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爲靈感。您可以使用TypeAccessor而不是ObjectAccessor這一點,但應該是一個擴展方法,我有太多的成功與:

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

相關問題