2

オブジェクトのメンバー変数である列挙型があります。列挙型の正確なタイプはわかりませんが、から派生しているだけですSystem.Enum。列挙型の基になる数値を設定したいと思います。言い換えると:

Enum e;
// ...
e = 42;  // Doesn't comple

これは可能ですか?それは反射で行うことができますか?

編集1:列挙型はより大きなデータ構造の一部であるため、Enum.ToObject()を使用して新しい値を作成することは適切ではありません。

編集2:列挙型がオブジェクトのメンバー変数であることを明確にしました。

編集3:数人のコメント投稿者がより多くのコンテキストを求めているので、ここに要約を示します。UIコントロール(テキストボックスなど)をオブジェクトデータモデルの対応するフィールドに関連付けることになっている汎用コードがあります。UIが変更されると、モデルが更新され、その逆も同様です。私はこれをコンボボックスと列挙の間のマップに拡張することを検討していました。ここで、列挙型は選択したコンボエントリのインデックスに設定されます。列挙型の基になる値から選択した項目を設定するのは簡単ですが、これとは逆に問題が発生します。これは不可能だと私はかなり確信していましたが、尋ねる価値があると思いました。

4

2 に答える 2

2

オブジェクト自体の値を実際に変更することはできませんが、同じタイプの新しいオブジェクトを取得できることに注意してください。何をしようとしているのかによっては、これがうまくいかない場合があります。あなたは何をしようとしているのですか?

e = Enum.ToObject(e.GetType(),42)

さて、ここでできる最善のことは、私が思うに、次のとおりです。

void SetTo42<T>(out T e) {
    e = (T)Enum.ToObject(typeof(T), e);
}

でも、これはとてもおかしなことなので、デザインを考え直すべきかどうか聞いてみます。


さて、私は手足に出て、あなたが何をしようとしているのかを推測します-あなたの「列挙型」はGetValueを使用することから来ていると仮定しているので、FieldInfo(またはPropertyInfo)を持っていると思います

void SetFieldTo42(Object obj, FieldInfo f) {
    f.SetValue(obj,Enum.ToObject(f.FieldType, 42));
}
于 2012-08-28T14:17:43.163 に答える
1

コンパイル時に列挙型を知らなくても、実行時Typeに列挙型を知る必要があります-理由はボックス化された値であり、何かをボックス化するには、型にアクセスできる必要があります(正しいものを返すように) ; たとえば、実行時にこれを実行します。Enum.GetType()

public Enum GetEnumValue(Type type) {
    return (Enum)Enum.ToObject(type, 42);
}
于 2012-08-28T14:17:21.830 に答える