1

我已经搜索并尝试了很多东西,但我并不完全满意。

在将旧项目从 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 语句,这是一个更糟糕的解决方案。

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

4

2 回答 2

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();
于 2013-10-21T21:20:12.730 回答
1

@里弗斯,

我在@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 类。

于 2013-10-21T21:39:53.653 回答