Можно ли передать произвольную группу методов в качестве параметра методу?
Я хотел бы написать функцию, подобную следующей
// The type 'MethodGroup' below doesn't exist. This is fantasy-code.
public void MyFunction(MethodGroup g)
{
// do something with the method group
}
Позднее я мог бы называть MyFunction
любой группой методов. Что-то вроде этого.
MyFunction(Object.Equals)
Если я передаю подпись, тогда все будет работать нормально.
public void MyFunction(Func<object, object, bool> f)
{
// do something with known delegate
}
...
MyFunction(Object.Equals)
Группа методов Object.Equals
счастливо принуждается к известному типу делегата Func<object, object, bool>
, но я не хочу фиксировать конкретную подпись. Я хотел бы передать любую группу методов в MyFunction
.
Группы методов не могут быть преобразованы в System.Object
public void MyFunction(object o)
{
// do something with o
}
...
MyFunction(Object.Equals) // doesn't work
Я думаю, что все забытые фигурные скобки на вызове метода и обнаружили это в какой-то момент. Я надеюсь, что это не означает, что группы методов не (или не могут быть преобразованы) в объекты первого класса.
Я не думаю, что выражения Linq дадут вид общности, которую я ищу, но я, конечно, мог бы что-то упустить.
Я также должен отметить, что было бы хорошо, если бы группа методов содержала перегрузки, если у меня есть способ проверки группы методов.
Что мне делать с группой методов? Я мог бы распечатать все подписи всех методов в группе (перегрузки, методы расширения и т.д.), или я мог бы "вызывать" группу с помощью некоторые аргументы (если это возможно, разрешить правильную перегрузку в группе). Существуют и другие способы сделать это, но это некоторые вещи, которые вы можете захотеть сделать с группой методов.
Как уже упоминалось несколько человек, я могу принять Delegate
и применить к известному типу делегата при вызове MyFunction
.
public void MyFunction(Delegate d)
{
// do something with d
}
...
MyFunction((Func<object, object, bool>)Object.Equals)
Но это не совсем то же самое, что передать всю группу методов. Это выбирает один метод из группы и преобразует его в конкретный делегат. Я бы очень хотел передать всю группу за один выстрел.
Ответы
Ответ 1
Вы можете передать делегат:
public void MyFunction(Delegate d)
{
// do something with the method group
}
Однако при вызове метода вам нужно будет указать тип делегата:
MyFunction(new Func<object, object, bool>(Object.Equals));
Примечание: приведенный выше код не передает группу методов, а один метод... Я не думаю, что можно передать группу методов. Почему вы хотите это сделать?
Ответ 2
Я думаю, что здесь важный вопрос: , что бы вы сделали с группой методов, если бы вы могли когда-нибудь пройти один?
Имейте в виду, что группа методов - это просто имя для набора методов - может быть один или несколько - и они могут быть перегрузками или методами расширения. Группы методов не являются концепцией, которая сохраняется в скомпилированном коде - компилятор поддерживает преобразования из групп методов в делегаты, но для того, чтобы это было возможно, компилятор должен иметь возможность разрешать без какой-либо двусмысленности именно тот метод, который вы собираетесь передать.
Группы методов действительны только как параметры для функций, если функция четко определяет сигнатуру метода. Так, например: public void MyFunction( Func<int> f )
может быть передан группе методов.
Ближе всего вы можете написать функцию, которая принимает тип Delegate:
public void MyFunction( Delegate d ) { ... }
но вы все равно не сможете передать группы методов, потому что нет преобразования из группы методов в делегат. Вам нужно будет указать конкретную подпись делегата:
// call MyFunction with a particular delegate
MyFunction( (Func<string>)myObj.ToString ); // method group conversion may occur
Ответ 3
Я думаю, вы могли бы использовать такую подпись:
MyFunc<T>(EventHandler<T> newDelegate)
{
object storedDelegate = newDelegate;
// after that you can use storedDelegate later
}