Как передать функцию func с параметром общего типа?
Мне нравится отправлять универсальную функцию преобразования типа в метод, но я не могу понять, как это сделать.
Здесь недействительный синтаксис, который объясняет, что мне нравится, проблема заключается в том, что я не знаю, как указать общий тип вместе с моей func:
public void SomeUtility(Func<T><object,T> converter)
{
var myType = converter<MyType>("foo");
}
Изменить (см. также мою дискуссию в комментариях к Лоуренсу): "Генерирующим преобразователем типа" я хотел бы передать в конвертер, который может преобразовать любой сильный тип <T> (не объект), поэтому следующая строка в моем методе может быть:
var myOtherType = converter<MyOtherType>("foo");
Делегат, который мне нравится передавать в качестве параметра, будет выглядеть примерно так:
private delegate TOutput myConverterDelegate<TOutput>(object objectToConvert);
Теперь это более синтаксис/С#, чтобы сделать что-то, я, скорее всего, буду использовать интерфейс, но я надеюсь, что это возможно сделать с помощью func/delegate.
Ответы
Ответ 1
У вас не могут быть экземпляры общих функций или действий - все параметры типа определены заранее и не могут быть переопределены вызывающим.
Легким способом было бы избежать полиморфизма в целом, полагаясь на понижающее литье:
public void SomeUtility(Func<Type, object, object> converter)
{
var myType = (MyType)converter(typeof(MyType), "foo");
}
Если вам нужна безопасность типа, вам необходимо отложить определение параметров типа для вызывающего. Вы можете сделать это, составив общий метод в интерфейсе:
public void SomeUtility(IConverter converter)
{
var myType = converter.Convert<MyType>("foo");
}
interface IConverter
{
T Convert<T>(object obj);
}
Edit:
Если тип "конвертер" известен на сайте вызова, и только этот тип будет использоваться внутри метода утилиты, тогда вы можете определить общий тип метода и использовать его, как и другие плакаты.
Ответ 2
public void SomeUtility<T>(Func<object, T> converter)
{
var myType = converter("foo");
}
а затем:
SomeUtility(arg => new MyType());
В этом случае будет работать общий вывод типа.
Ответ 3
Вам нужно сделать также SomeUtility
generic. Выполнение этого и исправление синтаксиса дает:
public void SomeUtility<T>(Func<object,T> converter)
{
var myType = converter("foo");
}
Ответ 4
Вы должны знать тип T во время компиляции, чтобы использовать его. T можно либо указать на уровне класса, либо на уровне метода.
class SomeClass<T> {
public void SomeUtility(Func<object, T> converter) {
var myType = converter("foo"); // Already is the T-type that you specified.
}
}
или
public void SomeUtility<T>(Func<object, T> converter) {
var myType = converter("foo"); // Already is the T-type that you specified.
}