Делегат для универсального класса и метода с универсальным типом возврата - PullRequest
0 голосов
/ 03 октября 2018

При использовании делегата с родовыми классами возникает проблема.Класс является общим, а метод - нет.Однако тип возвращаемого метода - универсальный тип.

public abstract class BaseEntity {
    public DateTime CreateDateTime { get; set; } = DateTime.Now;
    public long CreateUserId { get; set; }
}

public class ClassA : BaseEntity {

}

class Program {
    private delegate object MyDelegate(long id);
    private static MyDelegate _myHandler;

    static void Main(string[] args) {
        var genericType = typeof(TestClass<>).MakeGenericType(typeof(ClassA));
        var createMethod = genericType.GetMethod("CreateEntity");
        _myHandler = (MyDelegate)Delegate.CreateDelegate(typeof(MyDelegate), null, createMethod);

        var result = _myHandler(5);
    }
}

class TestClass<T> where T : BaseEntity, new() {
    public T CreateEntity(long userId) {
        return new T() { CreateUserId = userId };
    }
}

Это исключение кода.

Обновление 1: исправьте код, чтобы он был понятным.

Исключение:

An unhandled exception of type 'System.NullReferenceException' occurred in Unknown Module.
Object reference not set to an instance of an object. occurred

1 Ответ

0 голосов
/ 03 октября 2018

Проблема здесь:

_myHandler = (MyDelegate)Delegate.CreateDelegate(typeof(MyDelegate), null, createMethod);

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

Вы должны либо сделать ваш метод статичным, либо создать экземпляр genericType:

var instance = Activator.CreateInstance(genericType);
_myHandler = (MyDelegate)Delegate.CreateDelegate(typeof(MyDelegate), instance, createMethod);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...