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

标签 c# extension-methods

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

是否有可能限制可以在特定 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) {...}
}

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

This requirement is driven by grief that peer developers mix extension method on different types into one xxxExt class.It still works because compiler takes care of the resolution by looking at the imported namespaces.

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

当您使用静态方法声明静态类时,方法将在声明使用“命名空间”时自动可用,而不是类名! (除非您遇到的情况是您有一个包含多个 .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){...}
    }
}

如果您查看示例,两个类具有相同的名称,但由于它们位于不同的命名空间中,因此它们只会在显式声明每个命名空间的“使用”时扩展 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){...}
    }
}

关于c# - 是否可以将类中的扩展方法限制为特定类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16661863/

相关文章:

c# - 方法的扩展方法不在 IntelliSense 中显示

c# - Lambda表达式(扩展函数Select是怎么定义的?)

python - 如何从 .pyo 文件恢复源 python 代码 (.py)?

c# - 在 Console.WriteLine 中传递值

c# - C# 对象的 32 位哈希函数

c# - 船舶海事AIS信息API

c# - 如何创建需要 4 个字符且无空格的正则表达式?

c# - Winform 应用程序在将数据上传到数据库时显示超时过期错误

c# - 通用扩展方法的编译器错误

c# - 为什么扩展方法需要 "static"和 "this",它们的内存是如何分配的?