Редактировать: изменен неправильный термин бокс на кастинг.
У меня следующая проблема:
Если я создаю новый делегат типа Action или Func, он будет приведен к типу делегата.
var @delegate = Delegate.CreateDelegate(type, @object, methodInfo);
Но для универсального класса мне нужен правильно приведенный объект.
Рассмотрим следующий пример:
class Example<T> {
Type GenericType() {
return typeof(T);
}
}
static Example<T> Create<T>(T @delegate) {
return new Example<T>();
}
Example.Create(@delegate).GenericType();
Это вернет Delegate как тип, поскольку это был тип приведенного объекта (@delegate).
Одним из решений может быть приведение к делегату следующим образом:
if(@delegate is Action)
Example.Create((Action)@delegate).GenericType();
Но поскольку Delegate.CreateDelegate также может создавать делегаты Action или Func, проверить все варианты невозможно.
Я не могу изменить общий класс, поэтому я должен привести делегата.
Я надеюсь, что смог объяснить мою проблему. Я не являюсь носителем английского языка ...
Редактировать: Проблема в том, что typeof (T) не возвращает «реальный» тип объекта. Но я боюсь, что нет решения.