1

私は多くのことを検索して試しましたが、私は本当に完全に満足していません.

古いプロジェクトを VB.Net から C# に変換しているときに、2 つの言語間の動作が大きく異なり、対処しないと 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# では、最初のケースは"~/Something?var= "Val1で、2 番目のケースは "~/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にも同意します。

enum を明示的にフィルタリングする方法が見つからないので、そのような拡張メソッドを実装する方法に非常に興味があります。

私の場合、型フィルタリングを制限し、ランタイム検証を実行します。(私は明らかにコンパイル時間を好むでしょう):

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 に答える