6

私は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);

どうすればその変数をアンボックスしてそれらのプロパティにアクセスできますか??

4

5 に答える 5

13

まず、タイプを開梱していません。匿名型は参照型であり、構造ではありません。

技術的には、宣言されたメソッドの外部で同じタイプのインスタンスを作成できますが(C#3.0言語仕様のセクション7.5.10.6に従って、次のように記述されています。

同じプログラム内で、同じ名前とコンパイル時の型のプロパティのシーケンスを同じ順序で指定する2つの匿名オブジェクト初期化子は、同じ匿名型のインスタンスを生成します。

)タイプの名前を取得する方法はありません。これObjectは、作成したタイプに戻ってキャストを実行するために必要です。本質的に欠陥のある例によるキャストソリューションに頼る必要があります。

設計の観点から、宣言された関数の外部(および同じモジュール内)の型にアクセスするすべての場所で、型をもう一度効果的に宣言する必要があるため、例によるキャストには欠陥があります。

それは、ずさんな設計と実装につながる努力の重複です。

.NET 4.0を使用している場合は、オブジェクトインスタンスを動的変数に配置できます。ただし、主な欠点は、メンバーアクセスのコンパイル時の検証がないことです。メンバーの名前のつづりを簡単に間違えると、コンパイル時エラーではなく実行時エラーが発生する可能性があります。

最終的に、宣言されているメソッドの外部で匿名型を使用する必要がある場合、唯一の良い解決策は、具象型を作成し、具象型の代わりに匿名型を使用することです。

于 2010-02-19T21:25:25.193 に答える
8

いくつかの方法があります。

コメントは、これを行うことをお勧めしているように見えるので、明確にさせてください。オブジェクトを渡すつもりなので、オブジェクトの名前付きタイプを作成する必要があります。

まず、リフレクションを使用できます。これは、ここで別の回答がすでに指摘しています。

.NET をだまして正しい型を与える別の方法は、「例によるキャスト」として知られており、次のようになります。オブジェクトをジェネリック メソッド呼び出しで渡す必要があります。これにより、オブジェクトが正しい型として返されます。 、返す正しい型を推測することによって。

たとえば、これを試してください:

private static T CastByExample<T>(T example, object value)
{
    return (T)value;
}

そしてそれを使用するには:

var x = CastByExample(new { TheDay = ??, EntranceOrExit = ?? }, obj);

二人のために?? それらのプロパティのデータ型に適合するものを渡すだけで、値は使用されません。

これは、同じアセンブリ内に同じ型のまったく同じプロパティを同じ順序で含む複数の匿名型が、同じ単一の型にマップされるという事実を利用します。

ただし、この時点では代わりに名前付きタイプを作成する必要があります。

于 2010-02-19T21:23:11.817 に答える
3

匿名型にはメソッド スコープがあります。匿名型、または匿名型を含むコレクションをメソッド境界の外に渡すには、まず型をオブジェクトにキャストする必要があります。ただし、これは匿名型の強力な型指定を無効にします。クエリ結果を格納するか、メソッド境界の外に渡す必要がある場合は、匿名型ではなく、通常の名前付き構造体またはクラスを使用することを検討してください。

ソース: http://msdn.microsoft.com/en-us/library/bb397696.aspx

于 2010-02-19T21:19:25.490 に答える
1

いいえ、できません。リフレクションを使用してのみプロパティにアクセスできます。コンパイラは型が何であったかを知る方法がなく、匿名型であるため、キャストすることもできません。

于 2010-02-19T21:18:03.897 に答える
1

.NET 1.x ~ 3.x を使用している場合は、リフレクションを使用する必要があります。

.NET 4.0 を使用している場合は、動的型を使用して、予期されるプロパティを呼び出すことができます。

どちらの場合も、開梱する必要はありません。それは値型用です。匿名型は常に参照型です。

于 2010-02-19T21:18:37.293 に答える