2013-03-14 2 views
0

я застрял с проблемой # синтаксиса CУменьшить генериков в объявлении класса

Я хотел бы абстрагироваться мой код немного и я иду на что-то вроде этого:

public abstract class DMO<TDao ,TExtender> 
      where TDao : Dao 
      where TExtender : Extender<TDao> 
{ 
    abstract Dictionary<TExtender, PropertyInfo> Properties { get; set; } 
.... 
} 

только потому, что если я сделать

public abstract class DMO<TDao> 
      where TDao : Dao 
{ 
    abstract Dictionary<Extender<TDao>, PropertyInfo> Properties { get; set; } 
.... 
} 

Я не в состоянии использовать полученные из Extender<TDao>

есть пу способ сделать это проще (я застрял с .net 3.5, поэтому я думаю, что я не могу использовать коварианты для этого)

Спасибо

+1

Я не совсем уверен, чего вы пытаетесь достичь здесь. Может быть, немного уточнить, какую проблему вы пытаетесь решить? – rossipedia

+0

Вопрос заключается в уменьшении сложности классов, путем редукции общих параметров, у меня есть проблема с пониманием того, почему мне нужен TExender здесь, учитывая, что TExtender - это только Extender , но после некоторого поиска это может быть просто ограничение структуры и может быть разрешено используя ковариантные дженерики (но только с .net 4.0) – guillaume

+0

Вы уверены, что вы не можете использовать производный класс Extender в словаре? Я думаю, что ваш второй случай достаточно хорош и должен хорошо работать – Fendy

ответ

0

Просто

public abstract class DMO<T> where T: Extender<Dao> { 
    public abstract Dictionary<T, PropertyInfo> Properties { 
     get; 
     set; 
    } 
    // ... 
} 

Обратите внимание, что virtual или abstract члены не могут быть частными.

+0

ok, но я не уверен, что это работает, потому что Dao является абстрактным классом, и мне нужно tthat Extender , который будет использоваться как Extender guillaume

+0

Конечно, вы можете использовать любой универсальный класс, например 'Extender ', поскольку' DaoDerived' будет выводить от 'Dao', как вы планировали. –