Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为包含两个对象的字符串创建表达式树_C#_.net_Lambda_Expression Trees - Fatal编程技术网

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