调用具有多个泛型类型的泛型方法,而无需指定每个泛型类型

本文关键字:泛型类型 泛型方法 调用 | 更新日期: 2023-09-27 18:15:32

所以我有一个具有多个泛型类型的泛型方法。

现在我想这样调用这个方法(使用a和b的类型,只指定返回类型):

class Example
{
    T1 GenericMethod<T1, T2, T3>(T2 parameter1, T3 parameter2)
    {
        T1 returnValue = default(T1);
        // ... Do something with returnType, parameter1 and parameter2
        return returnValue;
    }
    void AccessGenericMethod()
    {
        var a = new Foo1();
        var b = new Foo2();
        var result = GenericMethod<ReturnType>(a, b); // doesn't work
    }
}

我想避免这样称呼GenericMethod

var result GenericMethod<ReturnType, Foo1, Foo2>(a, b);

调用具有多个泛型类型的泛型方法,而无需指定每个泛型类型

在c#中,没有部分类型推断:您必须指定所有或不指定泛型参数,但后者仅在编译器能够从上下文中推断所有类型时才有效。返回类型不能被推断(除了一些特殊的情况,如lambdas),所以你想做的是不可能的。

两个解决方法:A:将T1从方法移动到类

class Example<T1>
{
    T1 GenericMethod<T2, T3>(T2 parameter1, T3 parameter2)

B:用object代替T2T3

class Example
{
    T1 GenericMethod<T1>(object parameter1, object parameter2)

我找到了一个解决方案

class Example
{
    T1 GenericMethod<T1, T2, T3>(T2 parameter1, T3 parameter2, out T1 returnValue)
    {
        returnValue = default(T1);
        // ... Do something with returnType, parameter1 and parameter2
        return returnValue = new T1();
    }
    void AccessGenericMethod()
    {
        var a = new Foo1();
        var b = new Foo2();
        GenericMethod(a, b, out ReturnType result1); // work!
        ReturnType result2 = GenericMethod(a, b, out result2);
    }
}