Вы можете сделать это, но не в общем типе.Вывод универсального типа, подобный этому, происходит только для универсальных методов.Объявите отдельный не -общий тип с универсальным методом:
public class XYZ
{
public static XYZ Action<T, TKey> (TKey key, T element)
{
return new XYZ<T>(element);
}
}
РЕДАКТИРОВАТЬ: Отвечая на вопрос редактировать.
Нет, вы не можете что-то сделатькак это:
abc.Accept(Ordering.By(u => u.Id));
Проблема заключается во внутреннем выражении:
Ordering.By(u => u.Id)
Какого типа u
здесь?Это может быть любой класс со свойством Id
.Обратите внимание, что компилятору C # необходимо определить тип этого выражения до того, как увидит abc.Accept
.Даже если abc.Accept
только работал для Ordering<User>
, он потерпит неудачу.
Здесь есть три варианта:
Использовать статическийметод в универсальном классе, явно указывающий аргумент типа источника и выводящий аргумент типа ключа:
Ordering<User>.By(u => u.Id)
Использование универсального метода в неуниверсальном классе, указав оба аргумента типаявно:
Ordering.By<User, string>(u => u.Id)
Использовать универсальный метод в неуниверсальном классе, явно указав тип лямбда-параметра и позволяя компилятору выводить аргумент типа ключа:
Ordering.By((User u) => u.Id)
Очевидно, что все эти случаи требуют, чтобы вы где-то явно указывали тип.
Еще одна опция, которая является немного немного странной, актуальнаесли вы, как правило, уже получили экземпляр User
(или хотя бы переменную этого типа).Вы можете использовать это как своего рода пример, который игнорируется:
public static Ordering<T> By<T,TKey>(Expression<Func<T, TKey>> func, T example)
{
return By<T, TKey>(func);
}
...
Ordering.By(u => u.Id, dummyUser);