【问题标题】:How to create a generic extension method with additional type for generic interface如何为泛型接口创建具有附加类型的泛型扩展方法
【发布时间】:2015-06-08 12:38:00
【问题描述】:

今天遇到一个小问题,可惜没有找到好的解决办法。我想为一些通用接口创建一个扩展方法。该方法接受不同类型的泛型参数,如下所示

public interface IGenericInterface<TSource>
{
    void DoSomething<TDest>();
}

DotNetFiddle

如何以与DoSomething 方法完全相同的方式调用DoSomething2 方法(不传递第一种类型)?

public void DoSomething<TDest>()
//Called like below
testClass.DoSomething<object>();

而不是(就像我现在的签名)

public static void DoSomething2<TDest, TSource>(this IGenericInterface<TSource> interf)
//called like below
testClass.DoSomething2<string, object>(); // have to repass object type

我知道编译器不能自动推断第二种类型(link)。但我很好奇是否有人找到了解决方案。

【问题讨论】:

  • 以后,请在您的帖子中包含所有相关代码(作为文本)。小提琴很棒,但它们不能替代实际代码。我已将您的一些代码编辑到您的问题中。
  • 这是不可能的。理论上,c# 可能会推断出第一种类型,但它要么推断所有类型参数,要么不推断,你不能进行部分推断。
  • @ryanyuyu 谢谢,我会记住的。不幸的是,肯尼斯只有这样的信息才能找到我。在我看来,如果编译器可以推断出第二种类型,那就没有问题了。在这种情况下扩展方法很难理解。
  • 您实际上要解决的问题是什么?很有可能有一种更简单、更惯用的方法来解决它。

标签: c# generics extension-methods


【解决方案1】:

你的问题是参数 - 你依赖类型推断来处理第一个泛型类型,但是你想显式指定第二个 - 这在 C# 中是不可能的。

相反,为什么不改变参数的类型呢?

public static void DoSomething3<T, T2>(this IGenericInterface<T> interf, T2 parameter)
//called like below
testClass.DoSomething3((object)3);

这样,T 是根据 testClass 推断出来的(只要它没有歧义),T2 是根据 (object)3 推断出来的。

【讨论】:

  • 不幸的是,我无法将对象显式传递给此方法。为了更好地澄清这个问题,我修正了问题的内容,
  • @PawelMaga 好吧,太糟糕了。如果您真的想避免重复第一个参数,您可以使用DoSomething&lt;T, T2&gt;(this ..., T2 argument) 之类的方法,其中参数仅用于类型推断 - 然后您可以调用testClass.DoSomething3(default(object)) 或@987654328 @。当然,您仍然需要在运行时知道正确的类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-23
  • 1970-01-01
  • 1970-01-01
  • 2014-12-21
  • 2019-09-05
  • 1970-01-01
相关资源
最近更新 更多