Как использовать члены интерфейса в выражении - PullRequest
0 голосов
/ 24 марта 2012

Я немного боролся с этой крошечной проблемой - и я вполне уверен, что есть «простое» решение.

У меня есть базовый класс базового репозитория nHibernate с помощью следующего метода:

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 ]

3 голосов
/ 24 марта 2012

Первый

typeof(T) is ISetDeleted

вернет true, только если параметр типа равен ISetDeleted, а не если реализует интерфейс. Вы, вероятно, хотите

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

Во-вторых, я думаю, вы хотите

return session.Query<T>().Where(x => !((ISetDeleted)x).IsDeleted).ToList();
0 голосов
/ 24 марта 2012

Если вы можете написать это так, в будущем вам будет проще расширять, а также добавлять дополнительные ограничения:

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

, который должен работать при условии, что сессия. Query возвращает IQueryable

0 голосов
/ 24 марта 2012

Вы можете использовать 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(); 
        }
    }
}
...