作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
{ return new SomeType1((P1)args[0], -6ren">
我希望能够构建如下委托(delegate)的表达式:
Func<object[], object> createSomeType1 = (args) =>
{
return new SomeType1((P1)args[0], (P2)args[1], (P3)args[2]);
};
我刚开始使用手工制作的表达式,如果这是一个相当简单的问题(或者我误解了什么),请原谅。
我知道要创建具有正确类型的构造函数,我会执行以下操作:
var p1 = Expression.Parameter(typeof(P1));
var p2 = Expression.Parameter(typeof(P2));
var p3 = Expression.Parameter(typeof(P3));
var someType1Exp = Expression.New(constructorInfo, p1, p2, p3);
然后我知道“外部”lambda 是这样声明的:
Expression<Func<object[], object>>.Lambda<Func<object[], object>>(
someType1Exp,
Expression.Parameter(typeof(object[])));
我无法思考如何将参数从外部表达式“传递”到内部表达式,然后将其转换为正确的类型。
任何正确方向的提示都将受到赞赏。
最佳答案
我在 iPod 上,所以现在不能给出一个完整的例子:但是:
Expression.Param(typeof(object[]))
) 并将其存储在一个变量中Convert
”或“cast”(又是 iPod!)投它Expression.Invoke
,传递内部表达式加上您在上面生成的索引器+cast如果您需要(当我在 PC 上时),我很乐意稍后做一个完整的示例
完整示例:
Type[] types = new Type[] { typeof(int), typeof(float), typeof(string) };
var constructorInfo = typeof(SomeType).GetConstructor(types);
var parameters = types.Select((t,i) => Expression.Parameter(t, "p" + i)).ToArray();
var someType1Exp = Expression.New(constructorInfo, parameters);
var inner = Expression.Lambda(someType1Exp, parameters);
var args = Expression.Parameter(typeof(object[]), "args");
var body = Expression.Invoke(inner,
parameters.Select((p,i) => Expression.Convert(Expression.ArrayIndex(args, Expression.Constant(i)), p.Type)).ToArray());
var outer = Expression.Lambda<Func<object[], object>>(body, args);
var func = outer.Compile();
object[] values = {1, 123.45F, "abc"};
object obj = func(values);
Console.WriteLine(obj);
或者作为单个表达式:
Type[] types = new Type[] { typeof(int), typeof(float), typeof(string) };
var constructorInfo = typeof(SomeType).GetConstructor(types);
var args = Expression.Parameter(typeof(object[]), "args");
var body = Expression.New(constructorInfo,
types.Select((t,i) => Expression.Convert(Expression.ArrayIndex(args, Expression.Constant(i)), t)).ToArray());
var outer = Expression.Lambda<Func<object[], object>>(body, args);
var func = outer.Compile();
object[] values = {1, 123.45F, "abc"};
object obj = func(values);
Console.WriteLine(obj);
关于c# - 如何在 "sub"表达式中使用 lambda 表达式参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4135625/
我是一名优秀的程序员,十分优秀!