Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有泛型返回类型的泛型类和方法的委托_C#_Delegates - Fatal编程技术网

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

C# 具有泛型返回类型的泛型类和方法的委托,c#,delegates,C#,Delegates,将委托与泛型类一起使用时,会出现问题。类是泛型的,但方法不是。但是,方法返回类型是泛型类型 public abstract class BaseEntity { public DateTime CreateDateTime { get; set; } = DateTime.Now; public long CreateUserId { get; set; } } public class ClassA : BaseEntity { } class Program {

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

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 };
    }
}
问题在于:

_myHandler = (MyDelegate)Delegate.CreateDelegate(typeof(MyDelegate), null, createMethod);
的第二个参数获取该方法所属类型的实例

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

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

请提供完整的异常文本和堆栈跟踪。您能解释一下您想要实现的目标吗?问题:1。您试图使用泛型类型而不创建闭合类型
TestClass
没有向.NET指示它应该返回什么作为t,所以它怎么知道呢?2.您试图访问
TestClass
的实例方法,而不首先创建要使用的实例。@John I试图声明委托。我有一个泛型类,这个类使用DTO,我将它们转换为我的db对象。所以我需要用我的新db实体类型调用这个CreateEntity方法。@PetSerAl是的,因为除了null之外,不管什么,都会抛出另一个例子。什么参数通过?
var instance = Activator.CreateInstance(genericType);
_myHandler = (MyDelegate)Delegate.CreateDelegate(typeof(MyDelegate), instance, createMethod);