从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
吗?
分析包含一堆赋值的表达式树很容易,但不幸的是,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();
}
}