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
不存在强制转换,您仍然会得到一个运行时错误
进一步阅读
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();
}
}