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

3

我知道可以调用通用扩展方法

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
你是不是想要这样写: where T : Class1, IClass1, new() where U : Class2, IClass2, new() - gabba
1
我认为他所询问的是一种调用Convert方法的方式,只需要指定“结果”类型参数,并让编译器推断“输入”类型参数,即Result result = Convert<Result>(input);,我们知道input的类型是Input,而不是必须写成Result result = Convert<Input, Result>(input) - Dan Joseph
1
如果我的推断是正确的,请查看这个问题以获取答案:https://dev59.com/Q2DVa4cB1Zd3GeqPfJ4t - Dan Joseph
@David 不,我不需要 new 约束,你是对的。但是你的第二个假设是错误的。我将有多个转换方法,用于从 Class1 派生但实现不同接口的类。 - Nicolas Voron
1
那么 Class1 没有实现 IClass1 接口?好的,泛型约束就有意义了。(名称暗示 Class1 实现了 IClass1,下次考虑使用不同的示例名称。) - David Yaw
显示剩余4条评论
2个回答

2

在调用代码中指定Convert<Class2>是没有办法调用Convert<U, T>的。不过,如果你真的希望调用代码看起来像这样,也有可能实现。

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

不要在输入类型上使用通用的方式,只需指定输入类型的父类即可。这将给您想要的调用代码,但会使方法更加复杂。例如,如果转换过程涉及创建一个新的U对象(利用旧方法定义中的new()泛型约束),则必须在新方法中使用反射来完成。


我理解你的意思,但在我的特定情况下不可能实现。无论如何,感谢你确认这种方式不可行。 - Nicolas Voron

0
根据此帖子所述,通用参数推断仅适用于输入参数。在我的情况下,其中一个通用参数是返回类型。
由于需要通用类型推断提供所有参数,因此我必须明确指定每个参数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接