C #: выражение универсального метода с неизвестной сигнатурой

#c# #.net #generics #lambda #generic-programming

#c# #.net #дженерики #лямбда #общее-программирование #обобщения

Вопрос:

Например, у нас есть универсальный метод

 public void Test<T>(T param, Action<T> callback)
{

}
  

Если вызвать этот метод с некоторым параметром, он автоматически определяет тип T, и нам не нужно объявлять его явно.

Например:

 // here 'int' detected
Test(1, (intVariable) =>
{

});

// here 'string' detected
Test("hello", (stringVariable) =>
{

});
  

Теперь, есть ли какой-либо возможный способ сделать то же самое с помощью методов? Например

 Test(int.Parse, (parseMethod) =>
{
    parseMethod("11");
});
  

Да, методы с одинаковыми именами могут иметь разные сигнатуры, и невозможно определить, какой из них вы хотите использовать в качестве параметра, но, возможно, возможно что-то близкое.

Комментарии:

1. Я так не думаю, потому что в вашем конкретном примере вы хотите использовать статические методы, которые вызываются одинаково, но с другим типом возврата. Я не думаю, что это возможно, хотя может быть какая-то магия C #, которую я сейчас не помню

2. Неясно, что вы хотите сделать. int.Parse Имеет какое-то отношение к parseMethod ? parseMethod Возвращает что-нибудь? Что вы будете делать с возвращаемым значением? Откуда "11" берется?

3. Не совсем ясно, что вы хотите, чтобы это делало. Почему бы просто не вызвать int.Parse("11") ? Можете ли вы более подробно описать проблему, которую вы пытаетесь решить здесь? Звучит как проблема XY.

4. @RufusL, мне нужно имя метода в каком-то глобальном универсальном методе, без записи nameof() каждый раз. Например, Test<Func<Func<string, int>>>(() => int.Parse); в этом случае это отлично работает, если параметром является выражение<T>, но здесь я явно пишу сигнатуру метода.

Ответ №1:

Вы должны явно привести к Func<string, int> , чтобы заставить это работать:

 Test((Func<string, int>)int.Parse, (parseMethod) =>
{
    parseMethod("11");
});