C# 使用表达式进行数组转换
需要帮助才能让这段代码正常工作C# 使用表达式进行数组转换,c#,lambda,expression,func,C#,Lambda,Expression,Func,需要帮助才能让这段代码正常工作 var splits = rawTokens[startIndex + 2].Value.Split(','); var paramk = Expression.Parameter(typeof(String), "item"); var converter = Expression.Lambda(Expression.Convert( paramk
var splits = rawTokens[startIndex + 2].Value.Split(',');
var paramk = Expression.Parameter(typeof(String), "item");
var converter = Expression.Lambda(Expression.Convert(
paramk
, lToken.CorrespondingType), paramk);
var method = typeof(Array).GetMethod("ConvertAll").MakeGenericMethod(new Type[] { typeof(string), lToken.CorrespondingType });
var arrayBuilder = Expression.Call(method, Expression.Constant(splits), converter);
这与
System.ArgumentException:'System.Func
2[System.String,System.String]'类型的表达式不能用于'System.Converter
2[System.String,System.String]'方法'System.String[]ConvertAll[String,String](System.String[],System.Converter'2[System.String,System.String])的类型参数'尝试传递到Expression.Lambda()
。它位于其他参数的前面。嗯,您确实需要获取GetGenericTypeDefinition()
,然后MakeGenericType()
传递typeof(string)
和lToken.CorrespondingType
。您可能还需要检查lToken.CorrespondingType==typeof(string)的特殊情况
因为这样你就不需要转换了。@BenVoigt谢谢你。我已经尝试了第一种方法,但出现了强制错误。我肯定需要这种转换。考虑删除此表达式,但这是基于表达式的框架的一部分。如果错误消息不清楚,表达式lambda猜测它应该通过查看参数和返回类型生成Func
,但是Array.ConvertAll
需要转换器。你必须阻止它猜测,告诉它你想要一个转换器
,其中?
是用lToken填写的。CorrespondingType
。Type converterType=typeof(Converter);Type[]typeArgs={typeof(string),lToken.CorrespondingType};Type closedConverterType=converterType.MakeGenericType(typeArgs);var converter=Expression.Lambda(Expression.Convert(Expression.Convert(paramk,lToken.CorrespondingType),closedConverterType),paramk);