[英]Delegate for generic class and method with generic return type
使用帶有泛型類的委托時,會出現問題。 類是通用的,但方法不是。 但是方法返回類型是泛型類型。
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
問題在於:
_myHandler = (MyDelegate)Delegate.CreateDelegate(typeof(MyDelegate), null, createMethod);
您正在使用的.CreateDelegate
的重載的第二個參數采用該方法所屬類型的實例。
您應該使方法靜態,或者創建genericType的實例:
var instance = Activator.CreateInstance(genericType);
_myHandler = (MyDelegate)Delegate.CreateDelegate(typeof(MyDelegate), instance, createMethod);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.