2

問題をグーグルで検索し、SOも検索しました。それらのすべて(私が見つけた)が完了していないという解決策がたくさんあります。lambdaを使用して、によって選択されたクラスのプロパティとそのネストされたプロパティのプロパティを設定するのを手伝ってくれませんReflectionか?

public class Parent
{
    public class Child
    { 
        public int Id { get; set; }
    }

    public string Name { get; private set; }
    public int Number {get; private set; }
    public Child Nested { get; set; }

    public Parent()
    {
        Nested = new Child();
    }

    public Test Set<TValue>(Expression<Func<???> func, TValue value)
    {
        // find the property name from expression
        // set the property by value
        return this;
    }
}

コンシューマでは、次のことができるようにしたいと考えています。

Parent t = new Parent();
t.Set<int>(t => t.Number, 6)
 .set<string>(t => t.Name, "something")
 .Set<int>(t => t.Nested.Id, 25);
4

1 に答える 1

4

このようなものが動作するはずです:

public class Parent
{
    public Parent Set<TValue>(Expression<Func<Parent, TValue>> func, TValue value)
    {
        MemberExpression mex = func.Body as MemberExpression;
        if(mex == null) throw new ArgumentException();

        var pi = mex.Member as PropertyInfo;
        if(pi == null) throw new ArgumentException();

        object target = GetTarget(mex.Expression);
        pi.SetValue(target, value, null);
        return this;
    }

    private object GetTarget(Expression expr)
    {
        switch (expr.NodeType)
        {
            case ExpressionType.Parameter:
                return this;
            case ExpressionType.MemberAccess:
                MemberExpression mex = (MemberExpression)expr;
                PropertyInfo pi = mex.Member as PropertyInfo;
                if(pi == null) throw new ArgumentException();
                object target = GetTarget(mex.Expression);
                return pi.GetValue(target, null);
            default:
                throw new InvalidOperationException();
        }
    }
}
于 2012-06-07T21:02:19.753 に答える