我搜索并尝试了很多东西,但我并不是真的很开心。
在将旧项目从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语句,这是一个更糟糕的解决方案。
我错过了什么吗?有更清洁的方式吗?
答案 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类。