2017-04-12 14 views
3

一般的なリストからレコードを取得する際に問題があります。私はどこのクラスからでもレコードを取得したい共通の関数を作成しました。以下はサンプルコードです: -一般リストから項目を検索

public void Test<T>(List<T> rEntity) where T : class 
{ 
    object id = 1; 
    var result = rEntity.Where(x => x.id == id); 
} 

お勧めします。前もって感謝します。

+4

は、あなたが何を期待 '()'テストを行うには?または 'Test ()'?あなたの 'T'が制約の方法でもっと多くを必要とするように思えます... –

+2

TがクラスであるということはTがidというプロパティを持つオブジェクトの集合であるという意味ではないので、このコードはコンパイルすべきではありません。 –

+0

こんにちはJon、 'T'は、上記のメソッドを呼び出すときに渡すGenericクラスの名前です。ありがとう –

答えて

4

このような方法で、コンパイラの通常の質問は「何ですか」ですか? もしそれがちょうどクラスであれば、Jonが言及したように何でもかまいません。StringBuilderでも、 'Id'というプロパティがあるという保証はありません。それで、今のところそれをコンパイルすることさえできません。

A)メソッドを変更し、コンパイラが

B)を使用する反射を期待し、可能な場合は、より良いこれを避ける(実行時の操作を使用するためにどのような種類を知ってみましょう:

それは、我々は2つのオプションがあります動作させるために、サードパーティ製のライブラリで作業する場合は便利です)。

A - インタフェース・ソリューション:

public interface IMyInterface 
{ 
    int Id {get; set;} 
} 

public void Test<T>(List<T> rEntity) where T : IMyInterface 
{ 
    object id = 1; 
    var result = rEntity.Where(x => x.id == id); 
} 

B - リフレクション・ソリューション:

public void Test<T>(List<T> rEntity) 
{ 
    var idProp = typeof(T).GetProperty("Id"); 
    if(idProp != null) 
    { 
     object id = 1; 
     var result = rEntity.Where(x => idProp.GetValue(x).Equals(id)); 
    } 
} 
+0

ありがとうFabjan、あなたは私の多くの時間を節約しました。反射の解決策が私のために働いています。再度、感謝します。 –

1

あなたは、ほとんどのidプロパティを持つ基本クラスを定義して、Tは、その基本クラスから継承することがほとんど。

public class BaseClass{ 
public object ID; 
} 

、あなたはこのようなあなたの機能を変更することができます。

public void Test<T>(List<T> rEntity) where T : BaseClass 
{ 
    object id = 1; 
    var result = rEntity.Where(x => x.id == id); 
} 
関連する問題