使用多个泛型类型调用泛型方法而不指定每个泛型类型
Call generic Method with multiple generic Types without specifying every single generic Type
所以我拥有的是具有多个泛型类型的泛型方法。
现在我想以这种方式调用此方法(使用 a 和 b 的类型并仅指定 return 类型):
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# 中,没有部分类型推断:您必须指定全部或 none 泛型参数,但后者仅在编译器能够从上下文中推断出所有类型时才有效。 Return 无法推断出类型(lambda 等特殊情况除外),所以你想做的事情是不可能的。
两个解决方法:
A:将 T1
从方法移动到 class
class Example<T1>
{
T1 GenericMethod<T2, T3>(T2 parameter1, T3 parameter2)
B:将 T2
和 T3
替换为 object
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);
}
}
所以我拥有的是具有多个泛型类型的泛型方法。
现在我想以这种方式调用此方法(使用 a 和 b 的类型并仅指定 return 类型):
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# 中,没有部分类型推断:您必须指定全部或 none 泛型参数,但后者仅在编译器能够从上下文中推断出所有类型时才有效。 Return 无法推断出类型(lambda 等特殊情况除外),所以你想做的事情是不可能的。
两个解决方法:
A:将 T1
从方法移动到 class
class Example<T1>
{
T1 GenericMethod<T2, T3>(T2 parameter1, T3 parameter2)
B:将 T2
和 T3
替换为 object
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);
}
}