Подтвердить что ты не робот

Как передать функцию 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.

4b9b3361

Ответ 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.
}