#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");
});