C# 将泛型方法的使用委托给 return 任务<T>

C# Delegate use with Generic Method to return Task<T>

我遗漏了一些东西。我会尽可能清楚的。

假设我有这个方法:

    public Task<CustomClass> TestMethod(string one, string two, int three)
        {
            throw new NotImplementedException();
        }

我想创建一个通用方法,它采用这些方法(通过委托)并做一些事情。

所以假设我有这个 class 和一个委托和一个通用方法:

public static class SomeClass
{
    public delegate T CallbackMethodDelegate<T>(params object[] args);
    public static void InvokeMethod<T>(CallbackMethodDelegate<Task<T>> method, params object[] args) where T: class
        {
            method.Invoke(args);
        }

}

我的理解是 T 可以是 class,所以我应该可以在代码的某处这样做:

    SomeClass.InvokeMethod<CustomClass>(TestMethod, "one", "two", 3);

但是我得到编译错误

CS1503:Argument 1: cannot convert from 'method group' to 'SomeClass.CallBackMethodDelegate<Task<CustomClass>>'

我认为这可能是异步的,但即使我将委托更改为 void,我也会得到同样的错误。有什么想法我想念的吗?好像我在这里误解了关于委托或泛型的一些重要内容。提前谢谢大家。

因为错误表明您的方法与委托不兼容。委托需要 object[] 作为参数,您的方法有 3 个显式参数 string,string,int 这不兼容。

如果您确实需要这样做,您可以创建一组涵盖广泛方法的调用方法:

void InvokeMethod<TResult>(Func<Task<TResult>> method, TParam1 param1)
void InvokeMethod<TParam1, TResult>(Func<TParam1,Task<TResult>> method, TParam1 param1)
void InvokeMethod<TParam1,TParam2, TResult>(Func<TParam1, TParam2 ,Task<TResult>> method, TParam1 param1, TParam2 param2)

等等你需要的参数。

您可以将这些方法简化为类型不安全但不能直接访问的单一实现

void InvokeMethodImpl(Delegate method, params object[] args)
   => method.DynamicInvoke(args);

因此所有通用方法都将只调用此方法:

 void InvokeMethod<TParam1, TResult>(Func<TParam1,Task<TResult>> method, TParam1 param1) 
      => InvokeMethodImpl(method, param1);