【发布时间】:2015-10-15 09:32:13
【问题描述】:
我有这个注入器,它使用表达式注入数据
/// <summary>
/// Inject a data to an instance of T
/// </summary>
/// <typeparam name="T">The type of object as parameter</typeparam>
/// <param name="data">Object instance to where the data is injected</param>
/// <param name="pairData">Set of data info</param>
public static void InjectData<T>(this T data, Dictionary<Expression<Func<T, object>>, object> pairData) where T : IAuditable
{
// posible content of T data
// Employee
// : Code
// : Name
// : ID
// possible content of pairData
// Key: a => a.Code
// Value: "12345"
// Key: a => a.Name
// Value: "Vincent"
// after the injection, the data (Employee) will now have value on each properties: Code, Name
foreach (var _o in pairData)
{
var _value = Expression.Constant(_o.Value);
var _assign = Expression.Assign(_o.Key, _value);
//_lambda.Compile()(data);
//var _lambda = Expression.Lambda<Action<object, T>>(_assign, _value, _o.Key);
//_lambda.Compile()(_o.Value, data);
}
}
我只传递一个表达式和值的集合。
在哪里赋值的表达式(例如a => a.Code)和 值(例如“123456”)
我想将它分配给对象 T,但在我当前的尝试中,我得到了 System.ArgumentException:为 lambda 声明提供的参数数量不正确。我被卡住了,不知道下一步该怎么做。 :) 任何人都可以为我指出如何完成这项工作的正确方向吗?
这是示例用法
Employee _employee = new Employee();
Dictionary<Expression<Func<Employee, object>>, object> _x = new Dictionary
<Expression<Func<Employee, object>>, object>
{
{a => a.Code, "12345"}
};
_employee.InjectData(_x);
Assert.AreEqual("12345", _employee.Code);
我也试过了
foreach (var _o in pairData)
{
var _mem = _o.Key.Body as MemberExpression;
var _prop = _mem.Member as PropertyInfo;
var _setMethod = _prop.GetSetMethod();
_prop.SetValue(data, _o.Value);
我可以在这里看到一个进展,因为私有属性已经分配,但 getter 是 NULL
提前致谢
任何帮助将不胜感激。
【问题讨论】:
-
示例用法未编译。
-
哦,对不起,--已更新
标签: c# lambda expression