我使用的是 iPod,所以目前无法给出完整的示例:但是:
- 声明一个类型为 object[] 的参数 (
Expression.Param(typeof(object[]))
)并将其存储在变量中
- 对于数组中的每一项,使用数组indexer获取索引器的表达式,并且“
Convert
” 或“cast”(又是 iPod!)来投射它
- use
Expression.Invoke
,传递内部表达式加上上面生成的索引器+强制转换
如果您需要的话,我很乐意稍后做一个完整的示例(当我在电脑上时)
完整示例:
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);