Eri*_*ins 54 .net extension-methods enums enumeration
在vs2008中,是否可以编写适用于任何枚举的扩展方法.
我知道你可以针对特定的枚举编写扩展方法,但我希望能够使用单个扩展方法进行每个枚举.这可能吗?
Gre*_*ech 81
是的,只是针对基本Enum类型的代码,例如
public static void Something(this Enum e)
{
// code here
}
Run Code Online (Sandbox Code Playgroud)
从低端Enum.GetUnderlyingType来看,你最终可能会做一些非常讨厌的事情,例如根据枚举的基本类型找到真正的基类型,使用,转换和下降不同的分支,但你可以找到一些很好的用途它(例如我们有IsOneOf和IsCombinationOf适用于所有枚举的方法).
PS:请记住,在编写方法的时候,尽管不明智,但您可以使用float和double作为枚举的基本类型,因此您需要一些特殊情况以及无符号值.
Sco*_*man 18
是的你可以.目标扩展类型是类型Enum.在C#中,这将完成为:
public static void EnumExtension(this Enum e)
{
}
Run Code Online (Sandbox Code Playgroud)
或者在VB中这样:
<Extension()> _
Public Sub EnumExtension(ByVal s As Enum)
End Sub
Run Code Online (Sandbox Code Playgroud)
Mic*_*oie 18
仅供参考这是我能够使用的Enum Extension方法的一个很好的例子.它为枚举实现了一个不区分大小写的TryParse()函数:
public static class ExtensionMethods
{
public static bool TryParse<T>(this Enum theEnum, string strType,
out T result)
{
string strTypeFixed = strType.Replace(' ', '_');
if (Enum.IsDefined(typeof(T), strTypeFixed))
{
result = (T)Enum.Parse(typeof(T), strTypeFixed, true);
return true;
}
else
{
foreach (string value in Enum.GetNames(typeof(T)))
{
if (value.Equals(strTypeFixed,
StringComparison.OrdinalIgnoreCase))
{
result = (T)Enum.Parse(typeof(T), value);
return true;
}
}
result = default(T);
return false;
}
}
}
Run Code Online (Sandbox Code Playgroud)
您可以通过以下方式使用它:
public enum TestEnum
{
A,
B,
C
}
public void TestMethod(string StringOfEnum)
{
TestEnum myEnum;
myEnum.TryParse(StringOfEnum, out myEnum);
}
Run Code Online (Sandbox Code Playgroud)
以下是我访问过的两个网站,以帮助我们提供此代码:
这是另一个例子 - 也比不得不创建和初始化临时变量更好的恕我直言.
public static class ExtensionMethods
{
public static void ForEach(this Enum enumType, Action<Enum> action)
{
foreach (var type in Enum.GetValues(enumType.GetType()))
{
action((Enum)type);
}
}
}
public enum TestEnum { A,B,C }
public void TestMethod()
{
default(TestEnum).ForEach(Console.WriteLine);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
47694 次 |
| 最近记录: |