是否可以将类中的扩展方法限制为特定类型

本文关键字:类型 方法 扩展 是否 | 更新日期: 2023-09-27 18:14:25

这个需求是由于同级开发人员将不同类型的扩展方法混合到一个xxxExt类中而引起的。它仍然有效,因为编译器通过查看导入的名称空间来处理解析。但是当涉及到重叠类型时,它很烦人,也不容易维护。

是否有可能约束可以在特定的xxExt类中编写的类型扩展?循环手册规则不能很好地工作……可能像静态代码分析,如果不是编译器级别的限制?

代码(我想限制在这个类是IsActiveRisk方法)。

public static class TradeDataExt{
     public static bool IsActiveTrade(this TradeData tradeData){...}
     public static bool IsActiveRisk(this RiskData riskData) {...}

}

这更像是一个"想要的"功能,不确定是否可能。评论/建议会很有帮助。

是否可以将类中的扩展方法限制为特定类型

首先,在我看来,你写了你的例子,忘记了扩展方法中更重要的关键字,你错过了关键字"this"就在你的参数之前!:)

我猜你的意思是:

public static class TradeDataExt
{
     public static bool IsActiveTrade(this TradeData tradeData){...}
     public static bool IsActiveRisk(this RiskData riskData) {...}
}

好了,第一点说完了,现在我们来看看你的问题:

这个需求是由于同级开发人员混淆了扩展而引起的方法将不同类型的合并为一个xxxExt类。它仍然有效,因为编译器通过查看导入的对象来处理解析名称空间。

事实上,你所说的与扩展方法的工作原理完全相反!

当你用静态方法声明一个静态类时,当使用 "namespace"声明时,这些方法将自动可用,而不是类的名称!(除非您的项目中有几个.cs文件,这些文件是同一个静态类.....的部分类我的想法没有意义)

看一下这个例子:

namespace Gabriel.Extensions
{
    public static class ClassWithSameName
    {
         public static bool IsActiveTrade(this TradeData tradeData){...}
    }
}
namespace John.Extensions
{
    public static class ClassWithSameName
    {
         public static bool IsAGoodDeal(this TradeData tradeData){...}
    }
}

如果查看示例,两个类具有相同的名称,但由于它们位于不同的名称空间中,因此只有在显式声明每个名称空间的"using"时,它们才会扩展TradeData类。所以,我想说这就是你要走的路:

您应该使用名称空间来控制正在创建的类型扩展,因此您可以拥有像XXXX.Extensions这样的名称空间。验证、XXXXX.Extensions。计算,XXXXX.Extensions.ServicesProvider等等…而不是在同一个名称空间中使用所有名称空间(因为事情会变得复杂……在同一个命名空间中添加数百个扩展方法,这根本不是最佳实践

你的代码应该是这样的:

namespace TradeDataExtensions.Validation
{
    public static class ClassWithSameName
    {
         public static bool IsActiveTrade(this TradeData tradeData){...}
    }
}
namespace TradeDataExtensions.Analytics
{
    public static class ClassWithSameName
    {
         public static decimal ExpectedReturn(this TradeData tradeData){...}
    }
}