【发布时间】:2013-05-20 08:18:33
【问题描述】:
假设我需要一个简单的私有辅助方法,并且直观地在代码中将其作为扩展方法是有意义的。有没有办法将该助手封装到唯一真正需要使用它的类中?
例如,我试试这个:
class Program
{
static void Main(string[] args)
{
var value = 0;
value = value.GetNext(); // Compiler error
}
static int GetNext(this int i)
{
return i + 1;
}
}
编译器不会“看到”GetNext() 扩展方法。错误是:
扩展方法必须定义在非泛型静态类中
很公平,所以我将它包装在它自己的类中,但仍然封装在它所属的对象中:
class Program
{
static void Main(string[] args)
{
var value = 0;
value = value.GetNext(); // Compiler error
}
static class Extensions
{
static int GetNext(this int i)
{
return i + 1;
}
}
}
仍然没有骰子。现在错误状态:
扩展方法必须定义在顶级静态类中; Extensions 是一个嵌套类。
此要求是否有令人信服的理由?在某些情况下,辅助方法确实应该被私有封装,并且如果辅助方法是扩展方法,则在某些情况下代码会更清晰、更易读/可支持。对于这两个相交的情况,是否都可以满足,还是必须选择一个而不是另一个?
【问题讨论】:
-
阅读第一条错误消息的内容,它希望您的程序类是静态的,您是否尝试将其设为静态并尝试您的代码?
-
@Bearcat9425,这将“修复”这个特定的用例场景,但不是普遍适用的。我想这个问题是为了普遍适用,而不是针对示例控制台应用程序。
-
我怀疑你能得到的最好的方法是内部静态类/内部扩展方法并将其隐藏在一些不起眼的命名空间中......
-
@AlexeiLevenkov:你可能是对的,而且在大多数情况下,我只是巧合而已。似乎我的大多数“私人”助手都在抽象(依赖注入)程序集中,其内部甚至对域的其余部分都不可见,并且很容易使扩展成为顶级那个案子。直到最近才出现。
标签: c# extension-methods encapsulation