Генерики, где T производный от Delegate

188
09 июля 2017, 11:02

Делаю расширение:

using System.Reflection;
...
public static T GetMethod<T>(this Type type, string name) where T : System.Delegate {
    MethodInfo method = type.GetMethod(name);
    return (T)Delegate.CreateDelegate(typeof(T),method);
}

Всё бы было нормально, если бы не условность

Что интересно, сами классы System.Delegate и System.MulticastDelegate не являются типами делегатов. Они являются основой для всех конкретных типов делегатов. Тот же процесс конструкции языка требует, что нельзя объявить класс, который является производным от Delegate или MulticastDelegate. Это запрещено правилами языка C#.

Подскажите, каким образом я могу решить поставленную задачу?

Answer 1

В общем, с помощью информации от Grundy сделал вот такую заглушку:

    public static T GetMethod<T>(this Type type, string name) where T : class {
        if (!typeof(T).IsSubclassOf(typeof(Delegate))) {
            throw new InvalidOperationException(typeof(T).Name + " - не является делегатом!");
        }
        return Delegate.CreateDelegate(typeof(T),type.GetMethod(name)) as T;
    }

Если появятся другие ответы, обязательно посмотрю.

На основе ответа от @MarcGravell

READ ALSO
Недопустимое имя столбца

Недопустимое имя столбца

Переопределил DbContext и указал модель по которой буду работь с БД:

294
Имя &ldquo;Console&rdquo; не существует в текущем контексте. Visual Studio 2017 c#

Имя “Console” не существует в текущем контексте. Visual Studio 2017 c#

Перешел на Windows 10Поставил Visual Studio 2017 года

453
Сравнение DateTime через LINQ запрос

Сравнение DateTime через LINQ запрос

Нужно перебрать коллекцию, и вытащить элемент, дата которого равна заданнойПишу LINQ запрос:

311
C# в классе ArrayList есть два одноименных метода, возвращающих разные значения. WTF?

C# в классе ArrayList есть два одноименных метода, возвращающих разные значения. WTF?

Недавно рыскал по object browser'у, и увидел такую картину

220