1

以下のように、ジェネリックを介してこれを行うことができることはわかっていますが、ジェネリックを使用して親型を返す拡張機能を構築するにはどうすればよいですか?

汎用拡張署名:
public static TEnum FromString<TEnum>(this Enum par , string val ) where TEnum : Enum {
    return (TEnum) Enum.Parse(par.GetType(), val);
}
署名スタイル、私はそれがうまくいかないことを知っていますが、私が探しているものはちょっと.
public static this FromString(this Enum par , string val ) {
    return Enum.Parse(par.GetType(), val);
}

基本的に、1つのプロセスで値を文字列に解析する一連の列挙型があり、受信者として、検証のためにその文字列値を列挙型に解析する必要があります。最終的に、string値が列挙子で有効な値でない場合は、null またはdefault値が返されます。sourceジェネリックを実行しなくても、列挙子の型を返すことができる必要があるという事実です。

それが不可能な場合、それはkewlです。ジェネリックを使用せずに拡張ロジックパターンを使用して実行しようと考えただけです。

4

1 に答える 1

1

簡単な答えはノーです。正しいタイプの列挙型を返すにはGenericsが必要です。それ以外の場合は、列挙型の特定のタイプではなく
、基本的なタイプのみが使用されます。Enum

できることは、次のような拡張メソッドを作成することです。

public static Enum FromString(this Enum par, string val)
{
    return (Enum) Enum.Parse(par.GetType(), val);    
}

ただし、ご覧のとおり、特定の列挙型ではなく、「列挙型」のタイプを取得します。
一方で:

Enum val =  default(MyEnum).FromString("SomeEnumValue");
bool isEnum = val is MyEnum; // Returns True

ご覧のとおり、val タイプMyEnumであり、isEnumはtrue

これも機能します:

MyEnum val = (MyEnum)default(MyEnum).FromString("SomeEnumValue"); 
于 2012-12-31T17:41:32.997 に答える