首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用FastMember设置嵌套属性值

如何使用FastMember设置嵌套属性值
EN

Stack Overflow用户
提问于 2016-10-28 12:57:34
回答 3查看 2.1K关注 0票数 3

当我试图使用FastMember设置嵌套成员属性时,会得到一个异常。例如,当拥有这些类时

代码语言:javascript
复制
public class A
{
    public B First { get; set; }
}

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

我希望将实例的First.Second设置为"hello"

代码语言:javascript
复制
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

我不能把它分成“第一”,因为我不知道现在的深度。是否有对嵌套属性的神奇访问,还是必须自己拆分层次结构?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-10-28 13:14:24

您需要使用多个ObjectAccessor实例遍历对象图。

代码语言:javascript
复制
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;
}
票数 2
EN

Stack Overflow用户

发布于 2016-10-28 13:58:39

我用这种方式递归地使用扩展方法解决了这个问题:

代码语言:javascript
复制
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);
        }
    }        
}

..。这是从以下方面开始的:

代码语言:javascript
复制
ObjectAccessor.Create(a).AssignValueToProperty("First.Second", "hello")
票数 3
EN

Stack Overflow用户

发布于 2017-07-15 20:23:58

向“Beachwalker寻找灵感”致敬。但是,如果您使用的是TypeAccessor而不是ObjectAccessor,这是一种扩展方法,我在这方面取得了很大成功:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40305645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档