1

我正在尝试使用此签名将方法(函数)分配给 ExpandoObject:

public List<string> CreateList(string input1, out bool processingStatus)
{
  //method code...
}

我试图做类似下面这段代码的事情,但它不能编译:

dynamic runtimeListMaker = new ExpandoObject();
runtimeListMaker.CreateList =
     new Func<string, bool, List<string>>(
           (input1, out processingStatus) =>
                {
                     var newList = new List<string>();

                     //processing code...

                     processingStatus = true;
                     return newList;
                });

不幸的是,我无法更改 CreateList 签名,因为它会破坏向后兼容性,因此重写它不是一种选择。我试图通过使用委托来解决这个问题,但在运行时,我得到了一个“不能调用非委托类型”的异常。我想这意味着我没有正确分配代表。我需要帮助使语法正确(代表示例也可以)。谢谢!!

4

2 回答 2

5

此示例按预期编译和运行:

dynamic obj = new ExpandoObject();
obj.Method = new Func<int, string>((i) =>
    {
        Console.WriteLine(i);
        return "Hello World";
    });

obj.Method(10);
Console.ReadKey();

您的陈述的问题是您的 Func 不像您的签名那样使用输出参数。

(input1, out processingStatus)

如果您想分配您当前的方法,您将无法使用 Func,但您可以创建自己的委托:

    public delegate List<int> MyFunc(int input1, out bool processing);

    protected static void Main(string[] args)
    {
        dynamic obj = new ExpandoObject();
        obj.Method = new MyFunc(Sample);

        bool val = true;
        obj.Method(10, out val);
        Console.WriteLine(val);
        Console.ReadKey();
    }

    protected static List<int> Sample(int sample, out bool b)
    {
        b = false;
        return new List<int> { 1, 2 };
    }
于 2011-03-24T21:34:06.747 回答
0

您的代码中的问题是使用C# 中不允许out的参数类型作为processingStatus参数。

于 2011-03-24T21:36:59.350 回答