2012-03-14 10 views
0

Reflectionの使用中に奇妙な問題が発生しました。.Net Reflection GetProperties()

私は異なるプロパティを持つドメインクラスを持っています。ニーズに応じて、いくつかのプロパティは塗りつぶされ、一部は塗りつぶされません。

GUIでは、GetProperties()を使用してプロパティを反復処理し、その値に従って表示します。 (空ではありません。空ではありません)。

しかし!最初にプロパティを反復するとき、プロパティの順序は次回とは異なります。

初めて "ObjectMetaClassName" => "ShortName" => "Name" => "Url"を取得します。

「ObjectMetaClassName」=>「ShortName」=>「Url」=>「Name」を取得します。

誰でも説明がありますが、なぜこのようなことが起こりますか?

+0

いくつかのコードを投稿すると理解しやすくなります –

+1

物が何らかの命令を保証しない場合は、それを期待することはほとんどできず、さらにそれに頼ることになります。 –

+0

私はあなたの質問に答えることはできませんが、これはここで説明されているメソッドの定義された動作です:http://msdn.microsoft.com/de-de/library/kyaxdd3x.aspx –

答えて

5

http://msdn.microsoft.com/en-us/library/kyaxdd3x.aspxより:

getPropertiesメソッドは、アルファベット順や宣言順などの特定の順序でプロパティを返しません。あなたのコードは、その順序が異なるため、プロパティが返される順序に依存してはいけません。

注文が重要な場合は、結果を並べ替えることをお勧めしますか?

更新カスタムこれは、いくつかの複雑さを追加しますが、ソート属性を使用しての結果にするためのカスタム追加することができ

をソートします。

[AttributeUsage(AttributeTargets.Property)] 
public sealed class SortOrderAttribute : Attribute 
{ 
    private int _sortOrder; 

    public SortOrderAttribute(int sortOrder) 
    { 
     _sortOrder = sortOrder; 
    } 
} 

次はあなたのクラスのプロパティにその属性を適用します:まず、カスタム属性SortOrderAttribute作成次に

public class Foo 
{ 
    [SortOrder(1)] 
    public int Bar { get; set; } 

    [SortOrder(2)] 
    public string Name { get; set; } 
} 

をしたIComparer:最後に、並べ替えを取得する

public class PropertyInfoComparer : IComparer<PropertyInfo> 
{ 
    public int Compare(PropertyInfo a, PropertyInfo b) 
    { 
     return a.GetCustomAttributes(typeof(SortOrderAttribute), false)[0] - b.GetCustomAttributes(typeof(SortOrderAttribute), false)[0]; 
    } 
} 

リスト:

public PropertyInfo[] SortedList() 
{ 
    PropertyInfo[] properties = typeof(Foo).GetProperties(); 
    Array.Sort(properties, new PropertyInfoComparer()); 
    return properties; 
} 
+0

私は定義されているようにしたいと思います私のドメインクラス内。しかし、迅速な対応に感謝します。私はMSDNでその段落を忘れていたに違いない。病気が何かを描く。 –

+0

私はあなたが望むものを手に入れることができる方法の例を使って答えを更新しました。 –