C#函数调用多个泛型类型

时间:2012-09-24 15:58:54

标签: c# generics

我知道我可以调用泛型扩展方法

public static object Convert<U>(this U value) 

像这样(不需要<Class1>):

Class1Instance.Convert()

但有没有办法打电话:

public static T Convert<U, T>(this U value) 
  where T : Class1, Interface1, new()
  where U : Class1, Interface2, new()
{
  /******/
}

Class1Instance.Convert<Class2>()“仅”,而不是Class1Instance.Convert<Class1, Class2>()

谢谢,

编辑:

改革/简化: 有没有办法:

Result result = Convert<Result>(input); 

我们知道Input类型的输入,而不必说

Result result = Convert<Input, Result>(input)

使用如下所示的扩展方法:

static TResult Convert<TResult, TInput>(this TInput Input)

2 个答案:

答案 0 :(得分:2)

通过在您的主叫代码中指定Convert<U, T>,无法致电Convert<Class2>。但是,如果你真的希望调用代码看起来像这样,那么就有可能。

public static T Convert<T>(this Class1 value) 
  where T : Class1, IClass1, new()
{ ... }

不要在输入类型上使用泛型,只需指定输入类型的父类。这将为您提供所需的调用代码,但它会使方法更复杂。例如,如果转换过程涉及创建新的U对象(在旧方法定义中使用new()泛型约束),那么您必须在新方法中使用反射来完成

答案 1 :(得分:0)

根据this post,通用参数推断仅适用于输入参数。在我的例子中,泛型参数之一是返回类型。

由于要求泛型类型推断提供所有这些,我必须明确指定每个参数。