4

リフレクションを使用してシリアル化されたデータを作成するシリアル化コンポーネントを作成していますが、列挙されたプロパティから奇妙な結果が得られます。

enum eDayFlags
{
    Sunday = 1,
    Monday = 2,
    Tuesday = 4,
    Wednesday = 8,
    Thursday = 16,
    Friday = 32,
    Saturday = 64
}

public eDayFlags DayFlags { get; set; }

今、実際のテストのために

Obj Test = new Obj();
Test.DayFlags = eDayFlags.Friday;

シリアル化の出力は次のようになります。

DayFlags = Friday

しかし、変数に2つのフラグを設定した場合:

Obj Test = new Obj();
Test.DayFlags = eDayFlags.Friday;
Test.DayFlags |= eDayFlags.Monday;

シリアル化の出力は次のようになります。

DayFlags = 34

シリアル化コンポーネントで行っていることは非常に簡単です。

//Loop each property of the object
foreach (var prop in obj.GetType().GetProperties())
{

     //Get the value of the property
     var x = prop.GetValue(obj, null).ToString();

     //Append it to the dictionnary encoded
     if (x == null)
     {
          Properties.Add(HttpUtility.UrlEncode(prop.Name) + "=null");
     }
     else
     {
          Properties.Add(HttpUtility.UrlEncode(prop.Name) + "=" + HttpUtility.UrlEncode(x.ToString()));
     }
}

列挙型で値が1つしかない場合でも、PropertyInfo.GetValueから変数の実際の値を取得する方法を教えてもらえますか?

ありがとう

4

2 に答える 2

4

あなた本当の価値を引き出しています-それはあなたが期待することをしていない文字列への変換です。によって返される値はprop.GetValue、ボックス化されたeDayFlags値になります。

列挙型からの数値が必要ですか?にキャストしintます。列挙値をその基になる型のボックスから外すことができます。

フラグ列挙型である場合、列挙型(おそらく呼び出されるDaysはずです)が[Flags]適用されているはずであることに注意してください。

于 2012-08-14T13:40:35.480 に答える
1

これは予期される動作です。

Flags列挙型に属性を設定していないため.ToString()、基になる型としてキャストされた列挙型の文字列表現を返します (intデフォルト)。

追加すると、期待値[Flags]が強制的に返されます。つまり、.ToString()"Monday, Friday"


クラスを逆コンパイルすると、実装Enumで次のようなコードが表示されます。ToString()

//// If [Flags] is NOT present
if (!eT.IsDefined(typeof (FlagsAttribute), false))
//// Then returns the name associated with the value, OR the string rep. of the value
//// if the value has no associated name (which is your actual case)
    return Enum.GetName((Type) eT, value) ?? value.ToString();
else
//// [Flags] defined, so return the list of set flags with
//// a ", " between
    return Enum.InternalFlagsFormat(eT, value);
于 2012-08-14T13:46:38.523 に答える