【问题标题】:Get MemberAssignments from Action从操作中获取 MemberAssignments
【发布时间】:2014-05-09 08:04:47
【问题描述】:

我正在尝试构建一种可以从强类型语句体中捕获分配的方法。方法调用应如下所示:

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 =&gt; o.SomeProperty = 1);),我会得到“表达式树可能不包含赋值运算符”。

我是否需要使用其他类而不是 Expression

【问题讨论】:

    标签: c# .net-4.0 expression-trees


    【解决方案1】:

    分析包含一堆赋值的表达式树很容易,但不幸的是,C# 还不支持通过 lambdas 创建带有赋值或语句的表达式树,因为编译器错误提示。

    我建议您构建一个自定义对象,该对象可以保存 (member access 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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-09
      • 2016-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-24
      • 1970-01-01
      相关资源
      最近更新 更多