如何扩展类而不是实例?

3

可能是重复问题:
你能使扩展方法为静态或共享的吗?

扩展方法很棒! 请原谅我的无知,到目前为止,我只发现可以扩展类以允许其实例上的方法,但不能扩展类本身。

这就是我想做的。
我有一个枚举,如下所示:

enum ViewType
{
    Front_View,
    Back_View
}

我已经创建了一个扩展方法ToDescription(),用于显示视图类型的用户友好文本表示,例如:

ViewType thisview = ViewType.Front_View;
string thisviewtext = thisview.ToDescription();  // translates to "Front View"

但是在代码的后面,我想要从翻译中解析回类型,就像这个潜在的代码一样,如果我可以扩展枚举类型本身:

// !!!NOT REAL CODE YET!!!
// translate to value ViewType.FrontView
ViewType newview = ViewType.ParseFromDescription("Front View");

我该如何实现ParseFromDescription(string)扩展方法(如果可能的话)?

就算价值不大,这在像Ruby之类的编程语言中完全可行。如果您渴望这种控制权,则可能需要考虑更自由的语言。 - Matt Greer
3个回答

7

你不能这样做。你可以定义一个静态的帮助类ViewTypeTools,其中包含该方法。扩展方法基本上是相同的东西,但写起来更加优雅。


而且OP可能已经拥有了那个类,因为他在某个地方定义了扩展方法.ToDescription()。 - Kirk Woll
确切地说,与这个问题相关的是,我有时对枚举的功能很失望。我曾经通过为每个枚举值添加描述属性来解决类似的问题,但那样就不得不使用反射,而我尽量避免使用反射。 - Joachim VR

2

你不能像调用另一个静态类中的方法那样调用静态方法。比如说,你不能创建一个 String.IsNullOrBlank() 函数来检查传入的字符串是否仅包含空格、是否为 null 或零长度。你需要访问 String 类的代码并在其中添加该方法。

要得到你想要的结果,建议从字符串开始,实现一个扩展方法 ParseDescriptionToViewType(),方法以该字符串作为“this”参数,并输出 ViewType。


我喜欢你的回答有两个原因。 - BeemerGuy
首先,“你不能扩展静态方法,只能扩展实例方法”是底线。 - BeemerGuy
其次,跳出常规思维并扩展字符串实例以返回ViewType枚举。我喜欢这个! - BeemerGuy

0

另一个选项(笨拙的)我没有测试过,但我认为会起作用

((ViewType)null).ParseFromDescription( "Front View" );

// defined like 
public static ViewType( this ViewType me, string description )
{
    // ignore the 'this' parameter, just parse etc ...
}

第一行不是在编译时就会出现空指针异常吗(半开玩笑)? - BeemerGuy
不需要,因为编译器会自动将其更改为ViewTypeExtension.ParseFromDescription(null, "Front View");。只要在函数内忽略第一个参数(或执行对null有效的操作),就不会有问题。 - µBio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接