【发布时间】:2018-05-21 19:02:10
【问题描述】:
如果您有一个类型为数组但不是特定数组类型(如 int[])的表达式,我如何生成一个表达式,该表达式以快速的方式获取长度,而无需执行整个属性获取 malarkay。
例如在下面
ParameterExpression para3 = Expression.Parameter(typeof(int[]), "p3");
ParameterExpression para4 = Expression.Parameter(typeof(Array), "p4");
Type pt1 = para3.Type.GetElementType();
Type pt2 = para4.Type.GetElementType();
MethodInfo mArrayLength = Strong.Instance<Array>.Property<int>(a => a.Length).GetGetMethod();
Expression asdf5 = Expression.ArrayLength(para3);
Expression asdf6 = Expression.ArrayLength(para4);
Expression asdf7 = Expression.Call(para4, mArrayLength);
mArrayLength 只是 Array 类型的 Length 属性的 get 方法。
这里的表达式 asdf5 有效,因为 para5 是 int[] 类型,但 asdf6 没有,因为 para6 的类型只是 Array 类型。 asdf7 确实有效。
我想要的是有效地使用ldlen指令,它只需要一个Object,而不是调用一个方法。这只是表达式树库的限制吗?
您可以使用反射编辑字段,甚至可以编译表达式!但是尝试运行委托将导致操作可能会破坏运行时异常。
Array parr = new int[5];
Expression pArraylength = Expression.ArrayLength(para3);
pOperandFieldInfo.SetValue(pArraylength, para4);
Expression<Func<Array, int>> pexchanger = (Expression<Func<Array, int>>)Expression.Lambda(pArraylength, para4);
Func<Array, int> pFunc = pexchanger.Compile();
int pint = pFunc(parr);
【问题讨论】:
标签: c# arrays expression-trees cil