Intereting Posts
Как вызвать анонимную функцию в C #? Обработка десериализации WCF объектов DateTime неявный оператор с общим не работает для интерфейса aspx обеспечивает специальную обработку статических переменных c # Программное добавление элементов управления пользователя внутри UpdatePanel Преобразовать Html или RTF в синтаксис Markdown или Wiki Compatible? Возобновление выполнения кода после исключения бросается и ломается Свойство PropertyChanged для индексатора Обновление элементов управления WinForm из другого streamа _and_ class C #: При добавлении одного и того же объекта к двум переменным List , является ли объект клонированным в этом процессе? Форма сообщения с Facebook C # SDK Request vs Request.Params vs Request.QueryString Где учебные пособия для DotNetOpenAuth и как решить ошибку компиляции в своих выборках Как определить, сколько памяти занимает моя программа в настоящее время? Как показать сообщение со значком в области уведомлений

Как передать функцию func с параметром общего типа?

Мне нравится отправлять универсальный тип преобразователя в метод, но я не могу понять, как это сделать.

Вот недействительный синтаксис, который объясняет, что мне нравится, проблема заключается в том, что я не знаю, как указать общий тип вместе с моей func:

public void SomeUtility(Func converter) { var myType = converter("foo"); } 

Редактировать (см. Также мое обсуждение в комментариях с Лоуренсом): «Generic type converter» я имел в виду, что хотел бы передать в конвертер, который может преобразовать любой сильный тип (не объект), поэтому следующая строка в моей метод может быть:

 var myOtherType = converter("foo"); 

Делегат, который мне нравится передавать в качестве параметра, будет выглядеть примерно так:

 private delegate TOutput myConverterDelegate(object objectToConvert); 

Это скорее синтаксис / исследование C # сейчас, чтобы все было сделано, я, скорее всего, буду использовать интерфейс, но я надеюсь, что это можно выполнить с помощью func / delegate.

Вы не можете иметь экземпляры общих функций или действий – все параметры типа определены заранее и не могут быть переопределены вызывающим.

Легким способом было бы избежать polymorphismа в целом, полагаясь на литье:

 public void SomeUtility(Func converter) { var myType = (MyType)converter(typeof(MyType), "foo"); } 

Если вам нужна безопасность типов, вам необходимо отложить определение параметров типа для вызывающего. Вы можете сделать это, составив общий метод в интерфейсе:

 public void SomeUtility(IConverter converter) { var myType = converter.Convert("foo"); } interface IConverter { T Convert(object obj); } 

Редактировать:

Если «тип конвертера» известен на сайте вызова, и только этот тип будет использоваться внутри метода утилиты, тогда вы можете определить общий тип метода и использовать его, как и другие плакаты.

 public void SomeUtility(Func converter) { var myType = converter("foo"); } 

а потом:

 SomeUtility(arg => new MyType()); 

В этом случае будет использоваться общий тип вывода.

Вам также нужно сделать SomeUtility универсальным. Выполнение этого и исправление синтаксиса дает:

 public void SomeUtility(Func converter) { var myType = converter("foo"); } 

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

 class SomeClass { public void SomeUtility(Func converter) { var myType = converter("foo"); // Already is the T-type that you specified. } } 

или же

 public void SomeUtility(Func converter) { var myType = converter("foo"); // Already is the T-type that you specified. }