VB和C#之间的枚举行为

时间:2013-10-21 21:17:08

标签: c# .net enums

我搜索并尝试了很多东西,但我并不是真的很开心。

在将旧项目从VB.Net转换为C#时,我发现两种语言之间的行为非常不同,如果不处理,它会破坏C#中的逻辑。

考虑如下的枚举:

public enum TestEnum
{
    Val1 = 1,
    Val2 = 2
}

我在VB.Net中有这段代码

// Will contain 1
txthMyHiddenField.Value = TestEnum1.Val1 

// Will contain ~/Something?var=1
Dim Url As String = "~/Something?var=" & TestEnum1.Val1

在C#中,第一个案例有Val1,第二个案例有“〜/ Something?var = Val1

到目前为止,我无法重新设计大量代码的解决方案是到处去做类似的事情:

= myEnum.ToString("d");

// Or

= ((int)myEnum).ToString();

// Or an extension.

我还考虑创建一个枚举“类”,但后来我必须更改所有switch语句,这是一个更糟糕的解决方案。

我错过了什么吗?有更清洁的方式吗?

2 个答案:

答案 0 :(得分:5)

为什么不简单

var url = "~/Somethimg?var=" + (int)myEnum;

对于它的价值,也许这个扩展有帮助:

public static class EnumExtensions
{ 
    public static int AsInt<TEnum>(this TEnum enumType) where TEnum : struct, IConvertible
    {
        if (!typeof(TEnum).IsEnum)
            throw new ArgumentException("TEnum must be an enum type");
        return ((IConvertible)enumType).ToInt32(null);
    }
}

var url = "~/Somethimg?var=" + myEnum.AsInt();

答案 1 :(得分:1)

@Rivers,

我在@Tim Schmelter的帖子中添加了评论,要求提供更多信息,但同时会尝试提供解决方案。

@Eric,是正确的,因为它似乎归结为C#的显式特性。我也同意@THG,如果反复要求这种转换有任何改变,那么扩展方法是最简洁的方法。

我还没有找到明确过滤枚举的方法,所以我对如何实现这样的扩展方法非常感兴趣。

就我而言,我有限制类型过滤并执行运行时验证。 (我显然更喜欢编译时间):

public static string ToIntString<T>(this T enumVal) where T : struct, IConvertible, IComparable, IFormattable
{
   TestGenericEnum<T>();
   return (Convert.ToInt32(enumVal).ToString();
}

private static void TestGenericEnum<T>()
{
    if (!typeof(T).IsEnum)
        throw new ArgumentException("T must be of type System.Enum");
}

更新:根据@Preston的建议,在IComparable,IFormattable限制中投放。
更新2:骨头移动,无法直接转换为int,需要使用Convert类。