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

C# 是否可以将类中的扩展方法限制为特定类型?,c#,extension-methods,C#,Extension Methods,这一需求是由对等开发人员将不同类型的扩展方法混合到一个xxxExt类中引起的。 它仍然有效,因为编译器通过查看导入的名称空间来处理解析。但当涉及到重叠类型时,它很烦人并且不容易维护 是否有可能约束可以在特定xxExt类中编写的类型扩展?传阅手册规则效果不好。。。如果不是编译器级别的限制,可能类似于静态代码分析 代码(我想在这个类中限制的是IsActiveRisk方法) 这更多的是一个“期望的”特性,不确定是否可能。 评论/建议会很有帮助。首先,在我看来,您编写了示例,但忘记了扩展方法中更重要的关

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

是否有可能约束可以在特定xxExt类中编写的类型扩展?传阅手册规则效果不好。。。如果不是编译器级别的限制,可能类似于静态代码分析

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

这更多的是一个“期望的”特性,不确定是否可能。
评论/建议会很有帮助。

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

我猜你的意思是:

public static class TradeDataExt
{
     public static bool IsActiveTrade(this TradeData tradeData){...}
     public static bool IsActiveRisk(this RiskData riskData) {...}
}
P>好的,第一点说,现在让我们来看看你的问题:

这一需求是由对等开发人员混合扩展所驱动的 方法将不同类型的合并到一个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){...}
    }
}
如果您看一下这个示例,两个类都有相同的名称,但由于它们位于不同的名称空间中,因此只有在显式声明每个名称空间的“using”时,它们才会扩展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){...}
    }
}

你为什么不把它们作为
public bool IsActive{get{…}
TradeData
RiskData
类中?这对我来说没有意义。为什么您已经控制了类的扩展?+1使用@HighCore suggestedIt有意义的东西…我可能无法访问TradeData/RiskData库!!是的,错过了这个(直接在问题上键入此代码)。包括。关于名称空间,我的意思和你说的一样。用户在使用时只需包括扩展类名称空间。这种方法看起来是可用的,但又不是限制性的。老实说,这似乎是一个管理问题,而不是技术问题。为什么有可能限制所谓的“扩展”呢?我的观点是,您可以向开发人员指定所需的名称空间,然后强制他们使用您想要的方式。(您甚至可以使用一些反射来测试名称空间是否只扩展了特定类型)我的意思是,如果您的开发人员想要编写一些代码,他们会这样做,除非您定义了正确的方法。即使您编写了一些反射来检查您的整个解决方案的扩展方法,他们仍然可以创建一个帮助器类,并像TradeHelper.IsActiveTrade(trade)一样你将无法控制。你需要的是定义模式和标准,你将有一个团队随时准备与你合作。祝你好运:我同意这一点。作为一名开发人员,我会比任何其他开发人员更容易地听取(并同意)机器(编译器)的建议。在我看来,这同样适用于我们大多数人。
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){...}
    }
}