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

Man*_*ani 5 c# extension-methods

造成这种需求的原因是,对等开发人员将不同类型的扩展方法混合到一个xxxExt类中。它仍然有效,因为编译器通过查看导入的名称空间来解决解析问题。但是当涉及到重叠类型时,这很烦人并且不容易维护。

是否有可能限制可以在特定xxExt类中编写的类型扩展?传播手动规则效果不佳...如果没有编译器级别限制,可能类似于静态代码分析?

代码(我要在此类中限制的是IsActiveRisk方法)。

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

     public static bool IsActiveRisk(this RiskData riskData) {...}


}
Run Code Online (Sandbox Code Playgroud)

这更多的是“所需”功能,不确定是否可能。评论/建议会有所帮助。

Gab*_*pes 2

首先,在我看来,您编写了示例并忘记了扩展方法中更重要的关键字,您错过了参数前面的关键字“this”!:)

我猜你的意思是:

public static class TradeDataExt
{
     public static bool IsActiveTrade(this TradeData tradeData){...}
     public static bool IsActiveRisk(this RiskData riskData) {...}
}
Run Code Online (Sandbox Code Playgroud)

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

这一要求的驱动因素是同行开发人员将不同类型的扩展方法混合到一个 xxxExt 类中。它仍然有效,因为编译器通过查看导入的命名空间来处理解析。

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

当您使用静态方法声明静态类时,这些方法将在使用“命名空间”声明时自动可用,而不是类的名称!(除非您的项目有多个 .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){...}
    }
}
Run Code Online (Sandbox Code Playgroud)

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

您应该使用命名空间来控制正在创建的类型扩展,这样您就可以拥有诸如 XXXX.Extensions.Validation、XXXXX.Extensions.Calculation、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){...}
    }
}
Run Code Online (Sandbox Code Playgroud)