【问题标题】:Delegate for generic class and method with generic return type具有泛型返回类型的泛型类和方法的委托
【发布时间】:2018-10-03 05:09:47
【问题描述】:

将委托与泛型类一起使用时,会遇到问题。类是通用的,但方法不是。但是方法返回类型是泛型类型。

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. 您尝试使用泛型类型而不创建封闭类型。 TestClass&lt;&gt; 没有向 .NET 指示它应该返回什么作为 T,那么它怎么知道呢? 2. 您尝试访问TestClass&lt;&gt; 的实例方法,而无需先创建要使用的实例。
  • @John 我试图声明一个代表。我有一个通用类,这个类使用 DTO,我将它们转换为我的 db 对象。所以我需要用我的新数据库实体类型调用这个 CreateEntity 方法。
  • @PetSerAl 是的,因为除了 null 之外,抛出另一个例子。传递什么参数?

标签: c# delegates


【解决方案1】:

问题就在这里:

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

overload of .CreateDelegate you're using 的第二个参数采用方法所属类型的实例。

您应该将方法设为静态,或者创建 genericType 的实例:

var instance = Activator.CreateInstance(genericType);
_myHandler = (MyDelegate)Delegate.CreateDelegate(typeof(MyDelegate), instance, createMethod);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多