2015-11-15 3 views
3

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

public class MyDbSetWrapper<T> : IDbSetWrapper<T> 
     where T : class, IEntity 
{ 

} 

Я хочу, чтобы создать новый экземпляр этого класса из GetSet метода ниже. Ниже не компилируется, потому что MyDbSetWrapper ожидает T быть IEntity, но TEntity не ограничивается, чтобы быть в GetSet методом IEntity:

public IDbSetWrapper<TEntity> GetSet<TEntity>() where TEntity : class 
{ 
    return new MyDbSetWrapper<TEntity>(); 
} 

Как GetSet является реализация интерфейса третьей стороной, я m неспособно изменить общее ограничение на этот метод, чтобы включить IEntity, хотя TEntity всегда будет IEntity.

Как создать новый экземпляр MyDbSetWrapper из метода GetSet?

+1

Вы можете удалить ограничение типа IEntity и выполнить проверку времени выполнения, чтобы увидеть, что передаваемый тип реализует 'IEntity'. –

+1

@YuvalItzchakov: Собственно, вы не можете; что не позволит вам использовать членов типа. – SLaks

+1

@SLaks Это будет, но нужно ли OP использовать элементы типа? –

ответ

0

Вы не можете сделать это во время компиляции. Как вы заметили, для создания нового MyDbSetWrapper<TEntity> вам необходимо убедиться, что TEntity удовлетворяет по меньшей мере тем же самым типом ограничений, которые необходимы для типа MyDbSetWrapper<>. Поскольку вы не можете этого сделать, вы не можете создать тип с безопасностью типа времени компиляции.

Если вы не можете переместить IEntity типа в доступном месте, вы можете использовать только отражение здесь:

public IDbSetWrapper<TEntity> GetSet<TEntity>() 
    where TEntity : class 
{ 
    var type = typeof(MyDbSetWrapper<>).MakeGenericType(typeof(TEntity)); 
    return (MyDbSetWrapper<TEntity>) Activator.CreateInstance(type); 
} 

Обратите внимание, что это требует, чтобы IDbSetWrapper<T> не имеет ограничений на IEntity либо хотя. В противном случае он не будет работать, поскольку вы не можете гарантировать (снова), что TEntity в обратном типе IDbSetWrapper<TEntity> удовлетворяет ограничениям.

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