如何在表达式中使用接口成员

时间:2012-03-23 23:27:59

标签: c# interface lambda expression

我一直在努力解决这个小问题 - 而且我很确定这是一个“简单”的解决方案。

我有一个通用的nHibernate base-repository类,它有以下方法:

public IList<T> GetAll()
{
    using (var session = SessionProvider.OpenSession())
    {
        return session.Query<T>().ToList();
    }
}

但是 - 我试图通过使用一些非常简单的接口来控制我的模型。我有一个接口 - ISetDeleted:

public interface ISetDeleted
{
    bool Deleted { get; set; }
}

在我的GetAll()方法中,我想检查当前类型是否实现了这个接口 - 如果是,只返回未标记为已删除的实体:

public IList<T> GetAll()
{
    using (var session = SessionProvider.OpenSession())
    {
        if (typeof(T) is ISetDeleted)
        {
            // Only retrieve entities that are not marked as deleted
            // WHAT DO I DO HERE?
        }
        return session.Query<T>().ToList();
    }
}

我知道我可以检索所有实体并循环遍历这些 - 但我更喜欢更清洁的方法 - 例如实现检查的表达式(如果可能)。

如果有人可以帮我解决这个问题,我将非常感激:)

3 个答案:

答案 0 :(得分:3)

第一

typeof(T) is ISetDeleted

仅在类型参数 ISetDeleted时返回true,而不是实现接口。你可能想要

if (typeof(ISetDeleted).IsAssignableFrom(typeof(T)))

其次,我认为你想要

return session.Query<T>().Where(x => !((ISetDeleted)x).IsDeleted).ToList();

答案 1 :(得分:0)

您可以使用Linq(名称空间System.Linq):

public IList<T> GetAll()
{
    using (var session = SessionProvider.OpenSession())
    {
        if (typeof(ISetDeleted).IsAssignableFrom(typeof(T)))
        {
            return session.Query<T>().Where(o => !(ISetDeleted) o).Deleted).ToList();
        }
        else 
        {
            return session.Query<T>().ToList(); 
        }
    }
}

答案 2 :(得分:0)

如果您可以像这样编写它,将来会更容易扩展,并允许您添加其他约束:

public IList<T> GetAll()
{
    using (var session = SessionProvider.OpenSession())
    {
        var query = session.Query<T>();

        if (typeof(ISetDeleted).IsAssignableFrom(typeof(T)))
        {
            query = query.Where(x => !(ISetDeleted)x).Deleted);
        }

        return query.ToList(); 
    }
}
如果session.Query返回IQueryable

应该可以工作