如果在运行时之前不知道属性,如何设置lambda?

时间:2016-06-19 03:05:50

标签: c#

我试图制作一个可以在我的应用程序中的任何地方使用的通用方法。

这是我的方法:

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采用一个lambda表达式来指定约束,但是我无法设置它,因为在运行时之前不知道这些属性。我该如何设置?

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

您可以使用此解决方案的接口

require_once

或者您可以在运行时动态创建lambda表达式

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;
     }
}