C# 无法传递IEnumerable<;字符串>;作为Expression.Call中的参数
这是我的班级:C# 无法传递IEnumerable<;字符串>;作为Expression.Call中的参数,c#,linq,lambda,expression-trees,C#,Linq,Lambda,Expression Trees,这是我的班级: class SampleExpression { public static void SampleEnum(IEnumerator<string> ien) { while (ien.MoveNext()) { Console.WriteLine(ien.Current); } } } 在尝试创建方法调用表达式的行中出现以下错误: “System.Linq.Expres
class SampleExpression
{
public static void SampleEnum(IEnumerator<string> ien)
{
while (ien.MoveNext())
{
Console.WriteLine(ien.Current);
}
}
}
在尝试创建方法调用表达式的行中出现以下错误:
“System.Linq.Expressions.TypedConstantExpression”类型的表达式不能用于方法“Void Enum(System.Collections.Generic.IEnumerator1[System.String])”的“System.Collections.Generic.IEnumerator1[System.String]”类型的参数
请帮助。您似乎很困惑-看看C#编译器如何生成类似的表达式树可能会有所帮助。无论如何,你都犯了一些错误:
IEnumerable
不是IEnumerator
。它们不能互换
param2
是一个参数表达式,它采用SampleExpression
,而lambda实际需要IEnumerator
ep
是常量表达式的常量表达式。那不是你想要的。删除外部的表达式。常量
- lambda参数实际上并未使用-您可以使用
Func
而不是Func
- 表达式树没有返回值,而lambda希望返回
字符串
假设您希望有一个lambda,它接受IEnumerator
,并使用它调用SampleExpression.SampleEnum
,您可以使用如下内容:
public void Test()
{
var enumeratorParameter
= Expression.Parameter(typeof(IEnumerator<string>), "enumerator");
var sampleEnumMethod = typeof(SampleExpression).GetMethod("SampleEnum");
var methodCall = Expression.Call(sampleEnumMethod, enumeratorParameter);
var e = Expression.Lambda<Func<IEnumerator<string>, string>>
(
methodCall,
enumeratorParameter
);
var lstConstant = "1,2,3,4,".Split(',');
e.Compile()(lstConstant.ToList().GetEnumerator());
}
class SampleExpression
{
public static string SampleEnum(IEnumerator<string> ien)
{
while (ien.MoveNext())
{
Console.WriteLine(ien.Current);
}
return "Done!";
}
}
公共无效测试()
{
变量枚举参数
=表达式.参数(typeof(IEnumerator),“枚举器”);
var sampleEnumMethod=typeof(SampleExpression).GetMethod(“SampleEnum”);
var methodCall=Expression.Call(sampleEnumMethod,enumeratorParameter);
var e=表达式.Lambda
(
方法调用,
枚举参数
);
var lstcontent=“1,2,3,4,”.Split(',');
e、 Compile()(lstcontent.ToList().GetEnumerator());
}
类样本表达式
{
公共静态字符串SampleEnum(IEnumerator ien)
{
while(ien.MoveNext())
{
控制台写入线(ien.Current);
}
返回“完成!”;
}
}
您似乎很困惑-看看C#编译器如何生成类似的表达式树可能会有所帮助。无论如何,你都犯了一些错误:
IEnumerable
不是IEnumerator
。它们不能互换
param2
是一个参数表达式,它采用SampleExpression
,而lambda实际需要IEnumerator
ep
是常量表达式的常量表达式。那不是你想要的。删除外部的表达式。常量
- lambda参数实际上并未使用-您可以使用
Func
而不是Func
- 表达式树没有返回值,而lambda希望返回
字符串
假设您希望有一个lambda,它接受IEnumerator
,并使用它调用SampleExpression.SampleEnum
,您可以使用如下内容:
public void Test()
{
var enumeratorParameter
= Expression.Parameter(typeof(IEnumerator<string>), "enumerator");
var sampleEnumMethod = typeof(SampleExpression).GetMethod("SampleEnum");
var methodCall = Expression.Call(sampleEnumMethod, enumeratorParameter);
var e = Expression.Lambda<Func<IEnumerator<string>, string>>
(
methodCall,
enumeratorParameter
);
var lstConstant = "1,2,3,4,".Split(',');
e.Compile()(lstConstant.ToList().GetEnumerator());
}
class SampleExpression
{
public static string SampleEnum(IEnumerator<string> ien)
{
while (ien.MoveNext())
{
Console.WriteLine(ien.Current);
}
return "Done!";
}
}
公共无效测试()
{
变量枚举参数
=表达式.参数(typeof(IEnumerator),“枚举器”);
var sampleEnumMethod=typeof(SampleExpression).GetMethod(“SampleEnum”);
var methodCall=Expression.Call(sampleEnumMethod,enumeratorParameter);
var e=表达式.Lambda
(
方法调用,
枚举参数
);
var lstcontent=“1,2,3,4,”.Split(',');
e、 Compile()(lstcontent.ToList().GetEnumerator());
}
类样本表达式
{
公共静态字符串SampleEnum(IEnumerator ien)
{
while(ien.MoveNext())
{
控制台写入线(ien.Current);
}
返回“完成!”;
}
}
publicstaticvoidsampleenum(IEnumerator ien)和typeof(IEnumerable)-仔细查看:)谢谢Rob。你搞定了。公共静态void SampleEnum(IEnumerator ien)和typeof(IEnumerable)-仔细看:)谢谢Rob。你搞定了。啊!!我的问题有这么多拼写错误。谢谢,它被修复了:)-主要问题是Ienumerator和Ienumerable。正如你正确地指出的最后一点,我需要的是行动而不是职能。卢安:非常感谢你在这方面的帮助!!我的问题有这么多拼写错误。谢谢,它被修复了:)-主要问题是Ienumerator和Ienumerable。正如你正确地指出的最后一点,我需要的是行动而不是职能。卢安:非常感谢你在这方面的帮助