我正在使用需要表达式作为参数来识别/修改对象属性的 API。如果我在编译时知道类型,则效果很好。例如。 APi 需要
Expression<Func<T, object>>
我可以使用像
x => x.Id
这样的表达式来使用它
但是,在一般的世界中,我有一个对象 obj 可以使用,并且我知道该属性的名称。如何建造快车
Expression<Func<T, object>>
?
同样,我正在处理的 API 也需要一个表达式来将对象上的给定属性设置为给定值。
API 如下所示:
void Patch<T, U>(string id, Expression<Func<T, TProperty>> fieldPath, TProperty value)
当我知道 T 以及物体的样子时,我就可以
class MyClass { internal string Id {get; set;} }
Patch<MyClass, string>("some_id", x => x.Id, "someValue");
(补丁的通用定义是
Patch<T, TProperty>("some_id", x => x.Id, someValue);
其中 x 属于 T,someValue 属于 TProperty)
但是,如果我在编译时不知道 T 和 TProperty(但可以在运行时确定它们),我需要制定正确的表达式。
鉴于我正在使用的 API,我无法使用
PropertyInfo.GetValue/SetValue
(我确实有解决方案)
我理解您的担忧,因为我解决了类似的任务一种动态编译和执行具有参数列表的任何表达式的方法。
我现在不想深入了解您的代码,但建议您学习上面提到的我的解决方案。希望能帮到你。