Можно ли отправить метод объекта в функцию?

2

Мне интересно, возможно ли (и какой синтаксис) отправить метод объекта функции.

Пример:

Object "myObject" has two methods "method1" and "method2"

Я хотел бы иметь функцию по строкам:

public bool myFunc(var methodOnObject)
{
   [code here]
   var returnVal = [run methodOnObject here]
   [code here]
   return returnVal;
}

Так что в другой функции я мог бы сделать что-то вроде

public void overallFunction()
{
   var myObject = new ObjectItem();
   var method1Success = myFunc(myObject.method1);
   var method2Success = myFunc(myObject.method2);
}
  • 2
    Delgates должен решить вашу проблему
Теги:
methods
function

3 ответа

3
Лучший ответ

Есть ли необходимость в явных делегатах? Возможно, этот подход поможет вам:

private class MyObject
{
    public bool Method1() { return true; } // Your own logic here
    public bool Method2() { return false; } // Your own logic here
}

private static bool MyFunction(Func<bool> methodOnObject)
{
    bool returnValue = methodOnObject();
    return returnValue;
}    

private static void OverallFunction()
{
    MyObject myObject = new MyObject();

    bool method1Success = MyFunction(myObject.Method1);
    bool method2Success = MyFunction(myObject.Method2);
}
  • 2
    Не уверен, что это опечатка ... Func<...> очень это delegate .
  • 0
    Извините за удаление моего комментария, он был о "Действительно ли нужны делегаты?" и сделать пример с Func, который является делегатом ...
Показать ещё 2 комментария
8

Да, вам нужно использовать делегат. Делегаты довольно аналогичны указателям на функции в C/С++.

Сначала вам нужно объявить подпись делегата. Скажем, у меня есть эта функция:

private int DoSomething(string data)
{
    return -1;
}

Объявление делегата будет...

public delegate int MyDelegate(string data);

Затем вы можете объявить myFunc таким образом.

public bool myFunc(MyDelegate methodOnObject)
{
    [code here]
    int returnValue = methodOnObject("foo");
    [code here]
    return returnValue;
}

Затем вы можете вызвать его одним из двух способов:

myFunc(new MyDelegate(DoSomething));

Или, в С# 3.0 и более поздних версиях, вы можете использовать стенографию...

myFunc(DoSomething); 

(Он просто завершает предоставленную функцию в конструкторе по умолчанию для этого делегата автоматически. Вызовы функционально идентичны).

Если вы не хотите создавать делегат или реализацию фактической функции для простых выражений, в С# 3.0 также будет работать следующее:

public bool myFunc(Func<string, int> expr)
{
    [code here]
    int returnValue = methodOnObject("foo");
    [code here]
    return returnValue;
}

Что тогда можно было бы назвать так:

myFunc(s => return -1);
  • 1
    C # 3.5 также позволяет вам не объявлять свой собственный тип делегата, как вы можете сделать Func<string, int> который представляет ту же сигнатуру, что и ваш тип MyDelegate .
  • 1
    @Simon: в некоторых случаях да, есть некоторые встроенные типы делегатов, и 3.5 добавил несколько потенциально полезных в качестве части пакета поддержки LINQ. При этом возможность объявления делегата - это то, что, IMO, должен сделать любой разработчик .NET.
Показать ещё 1 комментарий
2

Да, используя делегатов..

Вот пример.

delegate string myDel(int s);
public class Program
{
    static string Func(myDel f)
    {
        return f(2);
    }

    public static void Main()
    {
        Test obj = new Test();
        myDel d = obj.func;
        Console.WriteLine(Func(d));
    }
}
class Test
{
    public string func(int s)
    {
        return s.ToString();
    }
}
  • 0
    Предоставление примера, вероятно, даст вам довольно много голосов ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню