2016-06-19 8 views
1

私はアプリケーション内のどこでも使用できる汎用メソッドを作成しようとしています。実行時までプロパティがわからない場合にラムダを設定するには?

public T GetEntry(ObjectId id) 
{ 
    IMongoCollection<T> collections = db.GetCollection<T>(database); 
    var getObj = collections.Find().FirstOrDefault();  // something like x => x.id == id 
    return getObj; 
} 

Findが制約を指定しますラムダ式を取りますが、プロパティは実行時まで知られることはありませんので、私はそれを設定することはできません。

は、ここに私の方法です。どうすれば設定できますか?

答えて

1

あなたは、このソリューション

public Interface IEntity 
{ 
    int Id {set ;get} 
} 


class EntryManagement<T> where T : IEntity 
{ 
    public T GetEntry(ObjectId id) 
    { 
     IMongoCollection<T> collections = db.GetCollection<T>(database); 
     var getObj = collections.Find(x => x.Id == id).FirstOrDefault();  
     return getObj; 
    } 
} 

のためのインターフェイスを使用するか、実行時にラムダ式を動的に作成することができます

public T GetEntry(ObjectId id) 
{ 
    IMongoCollection<T> collections = db.GetCollection<T>(database); 
    var parameterExpression = Expression.Parameter(typeof(T), "object"); 
    var propertyOrFieldExpression = Expression.PropertyOrField(parameterExpression, "Id"); 
    var equalityExpression = Expression.Equal(propertyOrFieldExpression, Expression.Constant(id, typeof(int))); 
    var lambdaExpression = Expression.Lambda<Func<T, bool>>(equalityExpression, parameterExpression); 

    var getObj = collections.Find(lambdaExpression).FirstOrDefault(); 
    return getObj; 
} 
+0

よしを、私はあなたの第二の溶液を試してみましたが、それは働きました! 'int型ではなく' ObjectId'型なので 'typeof(ObjectId)'に変更するだけです。しかし、ちょうど質問。私はあなたの最初のソリューションを使用する場合、私はすべての私のモデルクラスの 'IEntity'を実装する必要がありますか? –

+0

@CarlosMiguelColantaはい、私はあなたのモデルクラスのすべてがIEntityを実装しなければならないということを言及することを忘れています。私はハードタイプなので最初の解決策を好む。 – Kahbazi

2

は、発信者の検索式を変更しますか?その場合、おそらく呼び出し側から式を渡すのが最も簡単です。あなたが何かを行うことができます関数を呼び出すとき

public T GetEntry<T>(ObjectId id, Expression<Func<T, bool>> predicate) 
{ 
    IMongoCollection<T> collections = db.GetCollection<T>(database); 
    var getObj = collections.Find(predicate).FirstOrDefault(); // Call passed in predicate 
    return getObj; 
} 

その後:このような何かが

var person = GetEntry<Person>(id, person => person.Id == id);