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.IEnumerator
1[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。正如你正确地指出的最后一点,我需要的是行动而不是职能。卢安:非常感谢你在这方面的帮助