2016-10-28 25 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

相关问题