从Action中获取MemberAssignments

本文关键字:MemberAssignments 获取 Action | 更新日期: 2023-09-27 18:02:35

我正在尝试构建一个可以从强类型语句体捕获赋值的方法。方法调用应该像这样:

myObject.Assign(o =>
                {
                    o.SomeProperty = 1;
                    o.AnotherProperty = "two";
                });

我想要一份作业清单;一组MemberAssignment实例似乎很合适。

我不清楚Assign()的方法头需要看起来像什么。

以下是我目前的记录:

public class MyClass
{
    public void Assign(System.Linq.Expressions.Expression<System.Action<MyBunchOfProps>> assignments)
    {
    }
}
public struct MyBunchOfProps
{
    public int SomeProperty { get; set; }
    public string AnotherProperty { get; set; }
}

对于语句体和多个赋值,我得到"带有语句体的lambda表达式不能转换为表达式树"。

如果我省略语句体,只做一个赋值(myObject.Assign(o => o.SomeProperty = 1);),我反而得到"表达式树可能不包含赋值操作符"。

我需要使用不同的类而不是Expression吗?

从Action中获取MemberAssignments

分析包含一堆赋值的表达式树很容易,但不幸的是,c#还不支持通过lambdas创建带有赋值或语句的表达式树,正如编译器错误所指示的那样。

我建议你构造一个自定义对象,它可以保存一个(成员访问lambda, object)元组的列表,并使用它。

例如,您应该能够创建一个允许以下语法的类:
var list = new AssignmentList<MyBunchOfProps>
           {
               { o => o.SomeProperty, 1 },
               { o => o.AnotherProperty,  "two" }
           };

下面是一个示例实现:

public class AssignmentList<T> : IEnumerable<Tuple<LambdaExpression, object>>
{
    private readonly List<Tuple<LambdaExpression, object>> _list 
            = new List<Tuple<LambdaExpression, object>>();
    public void Add<TProperty>(Expression<Func<T, TProperty>> selector, TProperty value)
    {
        _list.Add(Tuple.Create<LambdaExpression, object>(selector, value));       
    }
    public IEnumerator<Tuple<LambdaExpression, object>> GetEnumerator()
    {
        return _list.GetEnumerator();
    }
    IEnumerator IEnumerable.GetEnumerator()
    { 
        return GetEnumerator();
    }
}
相关文章:
  • 没有找到相关文章