这一要求是由于同行开发人员将不同类型的扩展方法混合到一个 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/