Как метод с параметрами без присваивается ExpandoObject? - PullRequest
1 голос
/ 25 марта 2011

Я пытаюсь присвоить 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, потому что это нарушит обратную совместимость, поэтому переписать ее нельзя.Я пытался обойти это с помощью делегатов, но во время выполнения я получил исключение «Невозможно вызвать тип без делегата».Я предполагаю, что это означает, что я не назначаю делегата правильно.Мне нужна помощь в получении правильного синтаксиса (примеры делегатов тоже в порядке).Спасибо !!

Ответы [ 2 ]

5 голосов
/ 25 марта 2011

Этот пример компилируется и запускается как ожидалось:

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 };
    }
0 голосов
/ 25 марта 2011

Проблема в вашем коде в том, что используется out тип параметра для processingStatus параметра, который не разрешен в C #.

...