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();
}
}