2010-08-11 3 views
2

Я строю объект репозитория, и у меня есть интерфейс, IIdentifiable<T>. Таким образом, объекты, идентифицированные Гидами, например, реализуют IIdentifiable<Guid> with public Guid Id { get; }. Все идет нормально.Резервные общие аргументы?

У меня есть интерфейс IRepository<T, TIdentifier> where T : IIdentifiable<TIdentifier>.

Мне кажется, что общий аргумент TIdentifier является избыточным, потому что эта уже информация содержится в общем аргументе T. Есть ли способ, которым я могу иметь более чистую реализацию IRepository, где мне нужно указывать T в мой бизнес-код?

Я за чем-то вроде 'IRepository<T> where T : IIdentifiable<T.GenericArgs[0]>.

Я сомневаюсь, что это возможно, но просто подумал, что я спрошу. Может быть, у нового материала C# 4 есть что-то для этого?

ответ

2

Нет ограничений на T, что требует, чтобы он был общим. И нет ничего, что мешает классу реализовать IIdentifiable<T1>, IIdentifiable<T2>, ... IIdentifiable<Tn>, поэтому даже некоторых синтаксисов, говорящих «первый аргумент интерфейса IIdentifiable'1, реализованный T», будет недостаточным.

0

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

Кроме того, ваш план делает TIdentifier неизвестным в пределах IRepository который, я полагаю, это будет необходимо знать.

1

Вы можете создать IIdentifiable, который имеет object Id { get; }, а затем IIdentifiable<T> : IIDentifiable с общим идентификационным свойством.

Тогда вы можете уменьшить количество общих аргументов 1 следующим образом:

IRepository<T> where T : IIdentifiable 

На практике вы бы затем использовать IRepository<X> с X : IIdentifiable<Guid>

Это предполагает, что ваш IRepository главным образом заинтересованы в способности T, чтобы иметь ключ и не фокусируется на конкретном типе ключа.

+0

Дело в том, что общее свойство Id скроет не общий код –

+0

Ну, так как это интерфейсы, это не «действительно» скрывается. Предположительно, нестандартная явная реализация просто вызовет общее свойство Id – cordialgerm

Смежные вопросы