C # метод, который выполняет данный метод - PullRequest
5 голосов
/ 24 января 2011

Я пытаюсь написать следующее: я хотел бы написать метод "A", который принимает в качестве параметра другой метод "B", а также неизвестное число параметров для этого метода B. (params object [] args),Теперь внутри метода A я бы хотел вызвать B с параметрами args.Теперь B вернет объект, который я также хотел бы вернуть A.

Все это звучит немного странно, поэтому я добавлю пример кода:

public object A(Func<object> B, params object[] args)
{
    object x = B.Method.Invoke(args);

    return x;
}

Проблема в том,что Func не работает так.Кто-нибудь знает способ сделать это?

С уважением, Кристиан

Ответы [ 4 ]

3 голосов
/ 24 января 2011
void Main()
{
    Func<int> m1=()=>1;
    Console.WriteLine(A(m1));

    Func<int,int> m2=i=>i;
    Console.WriteLine(A(m2,55));
}

object A(Delegate B,params object[] args)
{

    return B.Method.Invoke(B.Target,args);
}

... прощай безопасность типа

3 голосов
/ 24 января 2011

Func<object> является делегатом для метода, который не принимает аргументов и возвращает object. Если изменить его на Func<object,object>, он примет аргумент и вернет объект:

public object A(Func<object, object> B, params object[] args)
{
    object x = B(args);

    return x;
}
1 голос
/ 24 января 2011

У вас должен быть такой код:

public object A(Func<object[], object> B, params object[] args)
{
    object x = B(args);

    return x;
}

Вам не хватает того, что перегрузка Func должна принимать массив аргументов вашего объекта.

В любом случае, если вам это нужнометод "A", чтобы принять функции без параметров, вы должны создать перегрузку параметра без параметров "A".

1 голос
/ 24 января 2011

Это должно сделать это:

public object A(Func<object[], object> B, params object[] args) 
{     
     object x = B(args);     
     return x; 
}
...