【问题标题】:Can I call an extension method from inside a generic class?我可以从泛型类中调用扩展方法吗?
【发布时间】:2013-07-17 04:54:07
【问题描述】:

有没有办法从泛型类中调用扩展,其中变量类也是扩展类?这是一段示例代码。它不编译。

public class GenericFoo<TFrom,TTo>
{
   public TTo GenericFoo(TFrom A)
   {
      return A.Bar();
   }
}

public static class Extensions
{
    public static MyType Bar(this MyExtendedType source)
    {
       return new MyType();
    }
}

这会产生以下错误:

'TFrom' 不包含 'Bar' 的定义和最佳扩展名 方法重载 'MyNamespace.Extensions.Bar(MyNamespace.MyExtendedType)' 有一些 无效参数

【问题讨论】:

    标签: c# generics extension-methods


    【解决方案1】:

    如果你添加一个泛型类型约束,你可以:

    public class GenericFoo<TFrom, TTo>
        where TFrom : MyExtendedType
        where TTo : MyType
    {
       public TTo SomeMethod(TFrom A)
       {
          return (TTo)A.Bar();
       }
    }
    

    这足以让它编译,但如果从 MyTypeTTo 不存在转换,您仍然会收到运行时错误。

    进一步阅读

    【讨论】:

    • 好吧,这首先违背了泛型类的目的。但它似乎是准确的。
    • @ArturoHernandez 你怎么能在不知道它的参数实际上是MyExtendedType 的情况下调用Bar?泛型允许您创建具有一种或多种类型的行为模式,而无需确切知道这些类型在编译时将是什么,但您仍然必须知道可以使用这些类型做什么才能建立模式。跨度>
    • @ArturoHernandez 我建议定义一个接口ISource,并将Bar 定义为Bar(ISource source),然后使用约束where TFrom : ISource。这样,您的泛型类将与更多种类的类型参数兼容。
    • @pswg 我可以在这里看到我的问题。我希望会有某种解决方法,但我现在更加悲观。由于我的特定用例界面无济于事,我感谢您的评论。
    • @ArturoHernandez 你总是可以使用dynamic。虽然在存在有效的通用解决方案时使用dynamic 感觉有点……恶心。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-21
    相关资源
    最近更新 更多