C# VB与C之间的枚举行为#

C# VB与C之间的枚举行为#,c#,.net,enums,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 ~/Somethi

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

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

我错过什么了吗?有更干净的方法吗?

为什么不简单

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();
公共静态类枚举扩展
{ 
公共静态int-AsInt(此TEnum枚举类型),其中TEnum:struct,IConvertible
{
if(!typeof(TEnum).IsEnum)
抛出新ArgumentException(“TEnum必须是枚举类型”);
返回((IConvertible)enumType).ToInt32(null);
}
}
var url=“~/somethmg?var=“+myEnum.AsInt();
为什么不简单

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();
公共静态类枚举扩展
{ 
公共静态int-AsInt(此TEnum枚举类型),其中TEnum:struct,IConvertible
{
if(!typeof(TEnum).IsEnum)
抛出新ArgumentException(“TEnum必须是枚举类型”);
返回((IConvertible)enumType).ToInt32(null);
}
}
var url=“~/somethmg?var=“+myEnum.AsInt();
@Rivers

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

@Eric是正确的,因为它似乎归结为C#的显式性质。我也同意@THG的观点,即如果有任何重复要求这种转换的变更,那么扩展方法是最干净的方法

我还没有找到一种显式过滤enum的方法,所以我对如何实现这种扩展方法非常感兴趣

在我的例子中,我有有限的类型筛选和执行运行时验证。(我显然更喜欢编译时):

publicstaticstring到intstring(这个T enumVal),其中T:struct,IConvertible,IComparable,IFormattable
{
TestGenericEnum();
return(Convert.ToInt32(enumVal.ToString());
}
私有静态void TestGenericEnum()
{
if(!typeof(T).IsEnum)
抛出新ArgumentException(“T必须是System.Enum类型”);
}
更新:根据@Preston的建议加入了IComparable、IFormattable限制。
更新2:骷髅头招式,不能直接施放int,需要使用转换类。

@Rivers

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

@Eric是正确的,因为它似乎可以归结为C#的显式性质。我也同意@THG的观点,即如果有任何重复要求这种转换的变化,那么扩展方法是最干净的方法

我还没有找到一种显式过滤enum的方法,所以我对如何实现这种扩展方法非常感兴趣

在我的例子中,我有有限的类型筛选和执行运行时验证(我显然更喜欢编译时):

publicstaticstring到intstring(这个T enumVal),其中T:struct,IConvertible,IComparable,IFormattable
{
TestGenericEnum();
return(Convert.ToInt32(enumVal.ToString());
}
私有静态void TestGenericEnum()
{
if(!typeof(T).IsEnum)
抛出新ArgumentException(“T必须是System.Enum类型”);
}
更新:根据@Preston的建议加入了IComparable、IFormattable限制。

更新2:硬头移动,不能直接转换int,需要使用Convert类。

如果需要,我喜欢添加扩展方法的想法。否则我只会转换为int。具体问题是什么?当值从字符串表示形式解析回枚举时,可以是数值或枚举值e的名字完全可以接受。可能是@NicholasCarey的重复不太可能,在我的例子中,枚举的使用永远不会被解析,而是一直被视为int。关键是int永远不会改变,但当重构时枚举的名称可能会丢失一些东西?不,显然不是。有没有更干净的方法?不,你提到过d
.ToString(“d”)
和强制转换为
int
你自己,你提到创建一个扩展方法。这些是自然的选择。享受吧。如果你非常需要,我喜欢添加一个扩展方法的想法。否则我只会强制转换为int。到底出了什么问题?当值从字符串表示形式解析回枚举时,或者数值或枚举值的名称是完全可以接受的。可能与@NicholasCarey重复不太可能,在我的情况下,枚举的使用永远不会被解析,而是一直被视为int。关键是int永远不会更改,但当重构am I缺少某些内容时,枚举的名称可能会更改?不,显然不会。是吗一个更干净的方法?不。你提到了
.ToString(“d”)
并将其转换为
int
你自己,还提到了创建一个扩展方法。这些都是自然选择。享受吧。它打破了像“string myStr=(int)myEnum”这样的其他代码,这些代码必须转换为“string myStr=((int)myEnum).ToString()”以及(int)myEnum不是一个字符串。因此您可以在其上使用ToString。“字符串”+(int)myEnum可以工作,因为+符号自动调用myEnum.ToString()。枚举上的ToString获取枚举的字符串名称,而不是枚举的int值,因此您必须先转换为int,然后再转换为string这只是c#和V之间的一个区别