C# 我可以从泛型类内部调用扩展方法吗?

C# 我可以从泛型类内部调用扩展方法吗?,c#,generics,extension-methods,C#,Generics,Extension Methods,有没有一种方法可以从泛型类中调用扩展,其中变量类也是扩展类?下面是一段示例代码。它不编译 public class GenericFoo<TFrom,TTo> { public TTo GenericFoo(TFrom A) { return A.Bar(); } } public static class Extensions { public static MyType Bar(this MyExtendedType source)

有没有一种方法可以从泛型类中调用扩展,其中变量类也是扩展类?下面是一段示例代码。它不编译

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();
    }
}
公共类GenericFoo
{
公共TTo通用文件(来自A)
{
返回A.Bar();
}
}
公共静态类扩展
{
公共静态MyType栏(此MyExtendedType源)
{
返回新的MyType();
}
}
这会产生以下错误:

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

如果添加泛型类型约束,则可以:

公共类GenericFoo
其中TFrom:MyExtendedType
其中:MyType
{
公共方法(从A开始)
{
返回(TTo)A.Bar();
}
}
这将足以让它编译,尽管如果从
MyType
TTo
不存在强制转换,您仍然会得到一个运行时错误

进一步阅读


好吧,这样做首先违背了泛型类的目的。但它似乎是准确的。@ArturoHernandez在不知道它的参数实际上是
MyExtendedType
的情况下,您希望如何调用
Bar
?泛型允许您使用一个或多个类型创建行为模式,而不知道编译时这些类型将是什么,但您仍然需要知道如何使用这些类型才能建立模式。@ArturoHernandez我建议定义一个接口,
ISource
,并将
Bar
定义为
Bar(ISource源代码)
,然后使用约束
,其中TFrom:ISource
。这样,泛型类将与更广泛的类型参数兼容。@pswg我可以在这里看到我的问题。我本来希望能有一些解决办法,但现在我更悲观了。由于我的特定用例接口没有帮助,我很感谢您的评论。@ArturoHernandez您可以随时使用一个。虽然当一个通用的解决方案存在时,使用
dynamic
,感觉有点……讨厌。
public class GenericFoo<TFrom, TTo>
    where TFrom : MyExtendedType
    where TTo : MyType
{
   public TTo SomeMethod(TFrom A)
   {
      return (TTo)A.Bar();
   }
}