- - PR -
リフレクションで返されるリスト内の順番
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-11-07 20:00
クラス内の情報の場合、経験則ではソースコードの上に書いてある順だと思えます。
しかし、MSDNでC#のリフレクションの概要や、GetFieldメソッドなどの項目を見ても、一覧を取得できるとあるだけで、順番については触れられていません。 「リフレクション 順番」「リフレクション 配列 順」 など思い当たるキーワードで検索してみても、ずばり記述してあるサイトに出会えませんでした。 リフレクションで返されるリスト内の順番がどうなっているのか、ご存知の方はいらっしゃらないでしょうか?よろしくお願いします。 | ||||||||
|
投稿日時: 2005-11-07 21:41
CLR で規定されていないなら、「実装による」でしょうね。
実際、順番がどうであれ、参照できればいいわけですから、実装に任せて規定していないと思います。 ハッシュテーブルを使っていたら、どんな順になるかはわからないでしょう。リニアテーブルを使っていたら、ソースコード順になるでしょう。順序づけされたテーブル使っていたら、何らかの辞書順になるでしょう。 ということで、実装に依存するような使い方はやめましょう。 ___________________________________________________________________ □ written by Jitta on 2005/11/07 □ Microsoft MVP :Visual Developer ASP/ASP.NET Oct.2005-Sept.2006 _________________ | ||||||||
|
投稿日時: 2005-11-07 22:21
Jittaさん、回答ありがとうございます。
情報格納クラスの複数の文字列フィールドの値を、意図した順に出力するという課題がありました。 対象となる情報格納クラスは結構な数になると予想されます。 抽象クラスに 1.リフレクションを使って呼び出し元インスタンス(継承クラス)の型のFieldInfoのリストを取得する。 2.リスト順に呼び出し元インスタンスの当該フィールドの値を出力する というメソッドを定義して、個別クラスで意図した順番どおりフィールド定義を書けば負担が減るかと考えました。 ですので、ソースコードの順番でリストが返ってくるという保障が必要でした。 実装に依存するということは、実行環境が変われば正常に動かなくなるかもしれないコードとなるわけですね。 | ||||||||
|
投稿日時: 2005-11-08 00:26
「機種に依存」だとか「端末に依存」とは言っていませんよね? この場合は、クラスの実装に依存という意味でしょう。 リフレクションについてですが、通常はメンバが定義された順番で返ります。 が、コンストラクタとプロパティは例外です。 プロパティは、get_, set_ が実体になります。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2005-11-08 06:39
あ、いや、「コンパイラの実装に依存」だと思います。 「クラスの実装」だと、『ソースコードの順番でリストが返ってくるという保障』がされるのではないでしょうか。 単にソースに出てきた順に並べてあるのではなく、参照しやすいように並べ替えてあるという前提で話をしています。 そういえば、継承なんかするとどうなるのでしょう?C# と VB.NET では、継承しているメソッドの、名前解決の順番が違います。まぁ、単に一覧するのとは違うかもしれませんが。 http://www.gotdotnet.com/team/clr/about_clr_Compilers.aspx http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpguide/html/cpconcommonlanguageruntimeoverview.asp http://devresource.hp.com/drc/specifications/ecma/index.jsp この辺に規定されていなければ、「実装依存」ということで。 | ||||||||
|
投稿日時: 2005-11-08 09:51
そうですね。 リフレクションは実行時に結果が確定するものが殆どですが、 今回のようなものは、IList でも実装していない限りは「コンパイラ依存」でしょう。 「共通言語ランタイム」ではなさそうですね。
名前解決の順番と関係あるんですかね? _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2005-11-08 10:05
順序保障が明記されていないのであれば最初から順序などアテにしないで、
取得したセットを自分でsortする方向で設計したほうがいいと思いますが…。 | ||||||||
|
投稿日時: 2005-11-08 21:23
あっと、そうそう。
それこそこちらの質問と同じことが出来るのではないでしょうか。
他に、カスタム属性を作って、それに順番を持たせ、リフレクションによって属性を参照しながら選択する、という方法もあると思います。 ___________________________________________________________________ □ written by Jitta on 2005/11/08 □ Microsoft MVP :Visual Developer ASP/ASP.NET Oct.2005-Sept.2006 _________________ |