質問
私は持っています Dictionary(TKey, TValue)
のように
Dictionary<int, ArrayList> Deduction_Employees =
new Dictionary<int, ArrayList>();
そして後でその配列リストに次のような匿名型を追加します
var day_and_type = new {
TheDay = myDay,
EntranceOrExit = isEntranceDelay
};
Deduction_Employees[Employee_ID].Add(day_and_type);
では、その変数をボックスから解除して、それらのプロパティにアクセスするにはどうすればよいでしょうか??
解決
まず、型を開梱するわけではありません。匿名型は参照型であり、構造体ではありません。
技術的には、宣言されたメソッドの外で同じ型のインスタンスを作成できます (C# 3.0 言語仕様のセクション 7.5.10.6 に従って、次のように規定されています)。
同じプログラム内で、同じ名前とコンパイルタイムタイプの一連のプロパティを同じ順序で指定する2つの匿名オブジェクト初期剤が、同じ匿名タイプのインスタンスを生成します。
) を入手する方法はありません 名前 からのキャストを実行するために必要なタイプ Object
作成したタイプに戻ります。に頼らなければなりません 例によるキャストソリューション それは本質的に欠陥があります。
Cast-by-example には欠陥があります。設計の観点から見ると、型が宣言されている関数の外側 (しかも同じモジュール内) で型にアクセスしたいすべての場所で、型を効果的に再度宣言する必要があるからです。
重複した作業が発生し、ずさんな設計と実装につながります。
.NET 4.0 を使用している場合は、 できた オブジェクト インスタンスを動的変数に配置します。ただし、大きな欠点は、コンパイル時にメンバー アクセスを検証できないことです。メンバー名のスペルを簡単に間違えると、コンパイル時エラーではなく実行時エラーが発生する可能性があります。
最終的には、 宣言されているメソッドの外で匿名型を使用する必要がある場合、唯一の適切な解決策は具象型を作成することです。 そして、具体的な型を匿名型に置き換えます。
他のヒント
いくつかの方法があります。
はコメントので、私はあなたがこれを行う示唆することを示しているようだ、私はそれを明確にしましょう:あなたはそれを周りに渡すつもり以来のあなたはオブジェクトの名前付きの型を作成する必要がありますの
まず、あなたはここで別の答えがすでに指摘しています。
リフレクションを使用することができますのトリックはあなたに右のタイプを与えることに.NETもう一つの方法は、「例でキャスト」として知られており、それがこのような何かを行く:あなたはのようなオブジェクトを返します。これは、一般的なメソッド呼び出しを通して、あなたのオブジェクトを渡す必要があります戻り値に正しい型を推論することにより、右タイプ、ます。
たとえば、これを試してください
private static T CastByExample<T>(T example, object value)
{
return (T)value;
}
とそれを使用します:
var x = CastByExample(new { TheDay = ??, EntranceOrExit = ?? }, obj);
2のための??スポットは、あなただけの、値が使用されることはありませんこれらのプロパティのデータ型をフィッティング何かを渡す必要があります。
これは、複数の匿名型が同じ単一の型にマッピングされ、同じアセンブリで、同じ順序で、同じタイプの、まったく同じ特性を有するという事実を利用する。
ただし、この時点であなたの代わりに名前付きの型を作成する必要があります。
匿名型は、メソッドのスコープを持っています。匿名型、またはメソッドの境界の外に、匿名型を含むコレクションを渡すには、最初のオブジェクトのタイプをキャストする必要があります。しかし、これは匿名型の強い型付けを破ります。あなたは、クエリの結果を格納またはメソッドの境界の外側にそれらを渡す必要がある場合は、代わりに匿名型の一般的な名前の構造体やクラスを使用することを検討します。
ソース: http://msdn.microsoft.com/en-us /library/bb397696.aspxする
はありませんあなたがすることはできません。あなただけのリフレクションを使用してプロパティにアクセスすることができます。コンパイラは、タイプが何であったか知る方法がない、そしてそれは匿名型なので、あなたはどちらかそれをキャストすることはできません。
を使用している場合は、.NET 1.1 - 。3.xでは、あなたはリフレクションを使用する必要があります。
あなたは.NET 4.0を使用する場合は、、あなたは動的型を使用すると期待される特性を呼び出すことができます。
はいずれの場合も、あなたはVHS版に必要なのです。それは、値型のためです。匿名型は、常に参照型です。