LINQ表达式创建具有不同对象类型的数组
本文关键字:对象 类型 数组 表达式 创建 LINQ | 更新日期: 2023-09-27 18:27:38
我正在根据用户输入进行一些解析,这里我需要解析应该是特定类型的参数数组。
在解析的时候,我不知道每个参数应该是哪种类型,但它可以被计算为任何类型。因此,我决定将它们临时存储在一组对象中。但当我尝试做这样的事情时:
NewArrayExpression returnValue = Expression.NewArrayInit(typeof(object), expressionList);
我得到以下异常:"System.Int32"类型的表达式不能用于初始化"System.Object"类型的数组。
我想,这是因为没有发生隐性拳击。所以我自己把它装箱:
expressionList.Add(Expression.TypeAs(expression, typeof(object))); or
expressionList.Add(Expression.Convert(expression, typeof(object)));
到目前为止还不错:我得到了数组中各种类型的对象的列表。
但是,当我最终得到所需的Type时,我尝试将上层数组中的所有值转换为该Type(假设该类型通常是int),我将其转换为
Expression.Convert(expr, typeof(int)); or
Expression.Unbox(expr, typeof(int));
当expr实际上是字符串"aaaaa"时,这是两个命令的调试视图:
(System.Int32)((System.Object)"aaaaa")
现在,我的问题是:这不会引发异常。但当表达式最终被编译时,它会被编译。字符串不是整数
也许这真的不应该是个例外,我不知道。但这对我不起作用。
有治疗方法吗?
编辑:代码如下:
static Expression InArguments(ParameterExpression pe, string[] arguments)
{
List<Expression> listaExpr = new List<Expression>();
foreach (string s in arguments)
{
Expression expression = Complete(pe, s); // evaluate argument
// listaExpr.Add(Expression.Convert(expression, typeof(object)));
}
return Expression.NewArrayInit(typeof(object), listaExpr);
}
在我看来,你知道类型,只是你计算得太晚了。如果你能改变这一点,就会解决你的问题。然后方法看起来是这样的:
static Expression InArguments(
ParameterExpression pe, string[] arguments, Type itemType)
{
List<Expression> listaExpr = new List<Expression>();
foreach (string s in arguments)
{
Expression expression = Complete(pe, s, itemType); // evaluate argument
listaExpr.Add(expression, typeof(object));
}
return Expression.NewArrayInit(itemType, listaExpr);
}
调用它的代码可能看起来像这样:
Expression inProperty = InProperty(…);
Expression inArguments = InArguments(pe, arguments, inProperty.Type);
Expression result = Expression.Call(containsMethod, inArguments, inProperty);
@swick
是的,那是我的问题。我的整个系统被设置为独立地解析左右操作数,然后检查它们之间的可转换性。所以,我希望IN运算符的右操作数返回对象数组的表达式,这样我就可以测试每个对象的可转换性,但在我看来,一旦我将它们转换为对象,它们就可以转换为任何东西???。
因此,我决定从我的右操作数返回以下表达式:
static Expression InArguments(ParameterExpression pe, string arguments)
{
string substr = arguments.Substring(1, arguments.Length - 2);
string[] arr = substr.Split(',');
return Expression.Constant(arr, typeof(string[]));
}
然后:
static Expression InOperator(Expression left, Expression right, ParameterExpression pe)
{
Expression finalexpr = null;
// this solved my problem.
string[] args = Expression.Lambda<Func<string[]>>(right).Compile()();
foreach (string s in args)
{
Expression converted = null;
try
{
Expression expr = Complete(pe, s);
converted = Expression.Convert(expr, (left as Expression).Type);
}
catch
{
throw;
}
if (finalexpr == null) finalexpr = Expression.Constant(false);
finalexpr = Expression.OrElse(finalexpr, Expression.Equal(left, converted));
}
return finalexpr;
}
我把我的参数设置为可以实际引用字符串[]的常量表达式中的左操作数类型,然后编译它以返回我的字符串参数。
但是,如果我能在一个对象数组中转发它,我会很高兴。。。