Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从操作中获取成员分配_C#_.net 4.0_Expression Trees - Fatal编程技术网

C# 从操作中获取成员分配

C# 从操作中获取成员分配,c#,.net-4.0,expression-trees,C#,.net 4.0,Expression Trees,我正在尝试构建一个方法,该方法可以从强类型语句体捕获赋值。方法调用应该如下所示: myObject.Assign(o => { o.SomeProperty = 1; o.AnotherProperty = "two"; }); 我想要一份作业清单;一组MemberAssignment实例似乎很合适 我不清楚Assign()的方法头应该是什么样子

我正在尝试构建一个方法,该方法可以从强类型语句体捕获赋值。方法调用应该如下所示:

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; }
}
公共类MyClass
{
公共无效分配(System.Linq.Expressions.Expression分配)
{
}
}
公共结构MyBunchOffrops
{
公共int SomeProperty{get;set;}
公共字符串另一个属性{get;set;}
}
对于一个语句体和多个赋值,我得到了“带有语句体的lambda表达式无法转换为表达式树”

如果省略语句体,只执行一个赋值(
myObject.Assign(o=>o.SomeProperty=1);
),则会得到“表达式树可能不包含赋值运算符”


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

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

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

例如,您应该能够创建一个允许以下语法的类:

var list = new AssignmentList<MyBunchOfProps>
           {
               { o => o.SomeProperty, 1 },
               { o => o.AnotherProperty,  "two" }
           };
var list=新分配列表
{
{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();
    }
}
公共类赋值列表:IEnumerable
{
私有只读列表
=新列表();
public void Add(表达式选择器,TProperty值)
{
_添加(Tuple.Create(选择器,值));
}
公共IEnumerator GetEnumerator()
{
返回_list.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{ 
返回GetEnumerator();
}
}