代码之家  ›  专栏  ›  技术社区  ›  is_oz

具有泛型返回类型的泛型类和方法的委托

  •  3
  • is_oz  · 技术社区  · 7 年前

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

    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 回复  |  直到 7 年前
        1
  •  3
  •   ProgrammingLlama Raveena Sarda    7 年前

    问题是:

    _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);