C # - передача функции неизвестного типа другой функции и вызов ее - PullRequest
1 голос
/ 15 августа 2011

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

Ответы [ 5 ]

3 голосов
/ 15 августа 2011

Конечно, вы можете просто взять Delegate и использовать Delegate.DynamicInvoke или Delegate.Method.Invoke. Если нет дополнительной информации, это ответит на ваш вопрос.

Таким образом:

class Foo {
    public void M(Delegate d) {
        d.DynamicInvoke();
    }
}

Action action = () => Console.WriteLine("Hello, world!");
var foo = new Foo();
foo.M(action);
3 голосов
/ 15 августа 2011
0 голосов
/ 15 августа 2011

или вы можете использовать лямбда-выражения. делегировать еще, но быстрее кодировать.

private static void Main(string[] args)
{
    NoReturnValue((i) =>
        {
            // work here...
            Console.WriteLine(i);
        });
    var value = ReturnSometing((i) =>
        {
            // work here...
            return i > 0;
        });
}

private static void NoReturnValue(Action<int> foo)
{
    // work here to determind input to foo
    foo(0);
}

private static T ReturnSometing<T>(Func<int, T> foo)
{
    // work here to determind input to foo
    return foo(0);
}
0 голосов
/ 15 августа 2011
  • Используйте Func для использования произвольных функций при сохранении безопасности типов.

    Это можно сделать с помощью встроенного универсального класса Func:

    При наличии методасо следующей подписью (в данном случае он принимает int и возвращает bool):

    void Foo(Func<int, bool> fun);
    

    Вы можете назвать это так:

    Foo(myMethod);    
    Foo(x => x > 5);  
    

    Вы можете назначить произвольные функцииэкземпляр Func:

    var f = new Func<int, int, double>((x,y) => { return x/y; });
    

    И вы можете передать этот f туда, где его можно будет использовать позже:

    Assert.AreEqual(2.0, f(6,3));  // ;-) I wonder if that works
    

    См. здесь для получения дополнительной информации.

  • Используйте Reflection, когда вы действительно не знаете параметров, но готовы платить за их исследование во время выполнения.

    Прочитайте об этом здесь .Вы будете раздавать экземпляры MemberInfo.Вы можете запросить его параметры для динамического определения их числа и типа.

  • используйте dynamic для полной свободы.Безопасность типов отсутствует.

    А в C # 4.0 теперь у вас есть ключевое слово dynamic.

    public void foo(dynamic f) {
      f.Hello();
    }
    
    public class Foo {
      public void Hello() { Console.WriteLine("Hello World");}
    }
    
    [Test]
    public void TestDynamic() {
      dynamic d = new Foo();
      foo(d);
    }
    

    Подробнее об этом здесь .

0 голосов
/ 15 августа 2011

Пример:

Action logEntrance = () => Debug.WriteLine("Entered");
UpdateUserAccount(logEntrance);

public void UpdateUserAccount(
           IUserAccount account, 
           Action logEntrance)
{
   if (logEntrance != null)
   {
      logEntrance();
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...