2


0

私はカスタムオブジェクトを持っています(わかりやすくするためのコード例のみ) …​

パブリッククラスMyClass {プライベート文字列名;プライベートintの増分プライベートGuid ID。

パブリック文字列Name {get {return name;} {名前=値を設定します。 }}

public int Increment {get {return increment;} set {increment = value;}を設定します。 }}

public Guid Id {get {return id;}; set {id = value;} }}}
  1. and a custom collection of this class …​

パブリッククラスMyClassCollection:Collection {

}

私は次のパブリックメソッドを持つことになるコレクションのSortルーチンを書きたいと思っていました…​

public void Sort(params string [] sortProperties){if(sortProperties == null){新しいArgumentNullExceptionをスローする( "sortProperties"、 "パラメータをnullにしないでください); }

if((sortProperties.Length> 0)
  1. and the private Sort method would take a parameter of the property 名前…​

private void Sort(stringプロパティ名){

}

私がやりたいことは、メソッドにプロパティ名のセットを渡すことができるということです…​

MyClassCollection current = new MyClassCollection();

//コレクション内のオブジェクトを設定するcurrent = GetCollectionData();

//名前でソートし、次にIncrementでソートするcurrent.Sort( "Name"、 "Increment");

メソッドに渡されたプロパティ名を使用して、その名前のプロパティがあるかどうかを確認することができます。その場合は、それがどのような型であるかを調べて、並べ替えます。

私が現在持っている暫定的な回避策は…​

private void Sort(string propertyName){//リストリストに変換myCurrentClass = Items as List;

//並べ替え(myCurrentClass!= null){switch(propertyName){case "Name":myCurrentClass.Sort(デリゲート(MyClass myClassOne、MyClass myClassTwo){return Comparer.Default.Compare(myClassOne.Name、myClassTwo.Name)}; ;));ブレーク;

case "Increment":myCurrentClass.Sort(デリゲート(MyClass myClassOne、MyClass myClassTwo){return Comparer.Default.Compare(myClassOne.Increment、myClassTwo.Increment);});ブレーク; }}}
  1. but ideally I would like to switch on the underlying type of the プロパティ(文字列、整数など)と並べ替えのための型のための異なる数のデリゲート呼び出しを使用します。 私は周りを見回しました、しかし、私は正しい方向に私を向ける何かを見つけませんでした。 私は熟考を見たことがありますが、私を助けてくれるものは何も見えませんでした。

これでも可能ですか? そしてもしそうなら、どうですか?

乾杯!

3 Answer


3


リフレクションが有効な方法です - `Type.GetProperty(string name)`を見てください。 その後、適切な比較子を作成するのは難しいかもしれません。一般的なメソッドを作成し、それをプロパティの種類に基づいてリフレクションを使用して呼び出すことができます。 それはすべて非常にうるさいです、私は怖い - しかし、それは間違いなく実現可能です。


3


Private void Sort(文字列propertyName){リストmyCurClass = ...

myCurClass.Sort((MyClass左、MyClass右)を委任する{

PropertyInfo lp = typeof(MyClass).GetProperty(プロパティ名);

Comparer.Default.Compare(pi.GetValue(左)、pi.GetValue(右));

;)); }

私はこれがあなたを始めさせるべきだと思います。 :)(テストもコンパイルもされていませんが、あなたはアイデアを得るでしょう)


1


しばらくの間、問題に頭を叩き、昨夜電車で家に帰ることを望んだ後、私は答えを試してみることにしました。 JonのポインタとFrederikのPropertyInfoクラスの使用を組み合わせて使用​​し、元のオブジェクトタイプをオンに切り替えるという当初の考えを維持して、これが私が思いついたものです…​

private void Sort_version2(string propertyName){//リストに変換リストmyCurrentClass =リストとしての項目。

ストリングtypeOfProperty; PropertyInfo pi;

// if((myCurrentClass!= null)をソートする

"System.Int32"の場合:myCurrentClass.Sort(MyClass 1、MyClass 2)を返す{Comparer.Default.Compare(Convert.ToInt32(pi.GetValue(one、null))を返す)、Convert.ToInt32(pi.GetValue(2) 、 ヌル)));                                             });ブレーク;デフォルト:new NotImplementedException( "未実装のプロパティの種類")をスローする。 }}}

私は 私のブログに思考過程と詳細を文書化しました。

JonとFrederikに助けを与えてくれてありがとう:-)