C# 为包含两个对象的字符串创建表达式树
我只是在学习C# 为包含两个对象的字符串创建表达式树,c#,.net,lambda,expression-trees,C#,.net,Lambda,Expression Trees,我只是在学习表达式及其表达式树,以便将它们与IronPython一起使用(但这与现在无关) 我想做的是创建一个表达式树,如以下lambda所示: Func<T, int, string> func = (s,t) => s + t; Func Func=(s,t)=>s+t; 我目前的职能是: public static Expression<Func<T, int, string>> StringConcatSelector<T>()
表达式及其表达式树,以便将它们与IronPython一起使用(但这与现在无关)
我想做的是创建一个表达式树,如以下lambda所示:
Func<T, int, string> func = (s,t) => s + t;
Func Func=(s,t)=>s+t;
我目前的职能是:
public static Expression<Func<T, int, string>> StringConcatSelector<T>()
{
var parameterParam = Expression.Parameter(typeof(T), "x");
var paramToString = typeof(T).GetMethods().FirstOrDefault(s=>s.Name=="ToString");
var parameter = Expression.Call(parameterParam, paramToString);
var intParameterParam = Expression.Parameter(typeof(int), "s");
var intParameterToString = typeof(int).GetMethods().FirstOrDefault(s => s.Name == "ToString");
var intParameter = Expression.Call(intParameterParam, intParameterToString);
var stringConcat = typeof(string).GetMethods().FirstOrDefault(s => s.Name == "Concat");
var result = Expression.Call(stringConcat, parameter, intParameter);
return Expression.Lambda<Func<T, int, string>>
(result, parameterParam, intParameterParam);
}
公共静态表达式StringConcatSelector()
{
var parameterParam=表达式.参数(typeof(T),“x”);
var paramToString=typeof(T).GetMethods().FirstOrDefault(s=>s.Name==“ToString”);
var parameter=Expression.Call(parameterParam,paramToString);
var intParameterParam=表达式.参数(typeof(int),“s”);
var intParameterToString=typeof(int).GetMethods().FirstOrDefault(s=>s.Name==“ToString”);
var intParameter=Expression.Call(intParameterParam,intParameterToString);
var stringConcat=typeof(string).GetMethods().FirstOrDefault(s=>s.Name==“Concat”);
var result=Expression.Call(stringConcat、parameter、intParameter);
返回表达式.Lambda
(结果,parameterParam,intParameterParam);
}
由于参数计数无效,String.Concat的表达式.Call
将无法以这种方式工作。
所以我想我需要像这样的东西:
- 创建
列表
-变量表达式
- 将这两个值添加到列表中
- 对列表表达式使用
String.Concat
我说得对吗
如果是,如何创建一个列表变量(或数组),添加这两个值以将其作为我的字符串的参数。Concat
?字符串。Concat
方法有11个(!)重载,而您使用的是随机重载
最适合你的情况是
public static String Concat(String str0, String str1)
您可以使用下面的Type.GetMethod
重载
public MethodInfo GetMethod(string name, Type[] types)
其中,types
数组表示方法参数的类型:
var stringConcat = typeof(string).GetMethod("Concat",
new[] { typeof(string), typeof(string) });
哦对我对这件事毫无头绪。很好,它工作得很好:)或者,您可以使用new[]{typeof(object),typeof(object)}
调用包含两个object
参数的重载,并且不需要调用ToString()
。使用解释表达式编译器,由于解释器的步骤较少,因此可能会更高效一些。如果使用IL编译一个,它的效率可能会稍低一些(int.ToString()
在直接调用时不必使用box,但这将使用box),但简化表达式可能仍然值得。@JonHanna感谢您的提示,但现在我得到了一个例外。它不能将Int32类型的对象用作type object的参数。@JonHanna这确实是一种替代方法,但您必须将参数包装在表达式中。Convert(expr,typeof(object))
@IvanStoev yep,这是有效的。你认为什么更有效率?我的意思是,当我重写ToString
时,我会得到我的字符串-我不会得到它,当我对对象进行强制转换时。我会吗?或者string concat调用到string
?