Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在表达式中使用接口成员_C#_Interface_Lambda_Expression - Fatal编程技术网

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

C# 如何在表达式中使用接口成员,c#,interface,lambda,expression,C#,Interface,Lambda,Expression,我一直在努力解决这个小问题,我很确定有一个“简单”的解决方案 我有一个具有以下方法的通用nHibernate基本存储库类: public IList<T> GetAll() { using (var session = SessionProvider.OpenSession()) { return session.Query<T>().ToList(); } } 在我的GetAll()方法中,我想检查当前类型是否实现了此接口,如果

我一直在努力解决这个小问题,我很确定有一个“简单”的解决方案

我有一个具有以下方法的通用nHibernate基本存储库类:

public IList<T> GetAll()
{
    using (var session = SessionProvider.OpenSession())
    {
        return session.Query<T>().ToList();
    }
}
在我的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();
    }
}
public IList GetAll()
{
使用(var session=SessionProvider.OpenSession())
{
如果(T的类型被删除)
{
//仅检索未标记为已删除的实体
//我在这里干什么?
}
返回session.Query().ToList();
}
}
我知道我可以检索所有实体并循环这些实体-但我更喜欢更干净的方法-例如,实现检查的表达式(如果可能)

如果有人能帮我解决这个问题,我将不胜感激:)

首先

typeof(T) is ISetDeleted
仅当类型参数被删除时才会返回true,而当实现接口时则不会返回true。你可能想要

if (typeof(ISetDeleted).IsAssignableFrom(typeof(T)))
第二,我想你想要

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

仅当类型参数被删除时才会返回true,而当实现接口时则不会返回true。你可能想要

if (typeof(ISetDeleted).IsAssignableFrom(typeof(T)))
第二,我想你想要

return session.Query<T>().Where(x => !((ISetDeleted)x).IsDeleted).ToList();
return session.Query().Where(x=>!((ISetDeleted)x).IsDeleted.ToList();
您可以使用Linq(namespace System.Linq):

public IList GetAll()
{
使用(var session=SessionProvider.OpenSession())
{
if(typeof(ISetDeleted).IsAssignableFrom(typeof(T)))
{
return session.Query().Where(o=>!(ISetDeleted)o).Deleted.ToList();
}
其他的
{
返回session.Query().ToList();
}
}
}
您可以使用Linq(namespace System.Linq):

public IList GetAll()
{
使用(var session=SessionProvider.OpenSession())
{
if(typeof(ISetDeleted).IsAssignableFrom(typeof(T)))
{
return session.Query().Where(o=>!(ISetDeleted)o).Deleted.ToList();
}
其他的
{
返回session.Query().ToList();
}
}
}

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

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(); 
    }
}
public IList GetAll()
{
使用(var session=SessionProvider.OpenSession())
{
var query=session.query();
if(typeof(ISetDeleted).IsAssignableFrom(typeof(T)))
{
query=query.Where(x=>!(ISetDeleted)x).已删除);
}
返回query.ToList();
}
}

如果该会话可用,则该选项应可用。查询将返回IQueryable

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

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(); 
    }
}
public IList GetAll()
{
使用(var session=SessionProvider.OpenSession())
{
var query=session.query();
if(typeof(ISetDeleted).IsAssignableFrom(typeof(T)))
{
query=query.Where(x=>!(ISetDeleted)x).已删除);
}
返回query.ToList();
}
}
如果该会话有效,该功能应该可以正常工作。查询返回一个IQueryable

我当时差点就搞定了(整个演员阵容中缺少括号):)非常感谢-你们太棒了!:)当时我差点就搞定了(整个演员阵容中缺少括号):)非常感谢你们——你们真是棒极了!:)