Создать интерфейс, производный от IEnumerable - PullRequest
3 голосов
/ 20 декабря 2009

У меня есть пара классов, все они являются производными от IQueryResult. Мне нужно, чтобы каждый из этих классов был повторяемым в цикле foreach. К сожалению, цикл foreach не может увидеть метод GetEnumerator. Мне удалось использовать его в foreach, используя динамическое ключевое слово, доступное в .NET 4.0, но тогда IQueryResult не нужно наследовать от IEnumerable.

public interface IQueryResult : IEnumerable<IQueryResult>
{
}

Как бы вы сделали это более элегантно?

С уважением PK

Ответы [ 2 ]

1 голос
/ 20 декабря 2009

Действительно ли IQueryResult IEnumerable<IQueryResult>? Например, можно ожидать, что (для одной сетки):

public interface IQueryResult<T> : IEnumerable<T> { /* */ }

или если вы пытаетесь представить несколько сеток:

public interface IQueryResult<T> : IEnumerable<IEnumerable<T>> { /* */ }

Хотя у меня может возникнуть желание сделать его более явным в качестве метода:

public interface IQueryResult<T> {
    IEnumerable<IEnumerable<T>> GetGrids(); // or something
}

Обратите внимание, что вам не нужно IEnumerable[<T>] для foreach, но это делает жизнь намного более предсказуемой и позволяет использовать LINQ и т. Д.

0 голосов
/ 20 декабря 2009

а. не наследуют чужие лица.

б. Вы можете использовать приведение к классу IEnumarable для этого класса, и оно будет работать

...