Есть ли способ не использовать динамический при создании экземпляра типа, который наследуется от универсального? - PullRequest
2 голосов
/ 15 декабря 2010

Как я могу создать экземпляр типа, который наследует от универсального, и статически привести его к базовому типу

foreach(Type t in x.ChildType.Assembly.GetTypes())
{
    if (t.BaseType.IsGenericType)
    {
        if (t.BaseType.GetGenericTypeDefinition() == typeof(ClassMapExt<>)) 
        {
            if (t.BaseType.GetGenericArguments()[0] == x.ChildType) 
            {
                // t is BonusMap. BonusMap is declared as:
                // class BonusMap : ClassMapExt<Bonus>
                dynamic bz = Activator.CreateInstance(t);  

                // the last line is analogous to:
                // var bz = new BonusMap();

                // statically casting it doesn't work
                // var bz = (ClassMapExt<>) Activator.CreateInstance(t); 

                foreach (IManyToOneMappingProvider imt1 in bz.ExtReference)

1 Ответ

2 голосов
/ 15 декабря 2010

Обычно способ сделать это состоит в том, чтобы включить туда неуниверсальный API (возможно, с явной реализацией).Затем вы просто приводите не универсальный интерфейс.

Не совсем то же самое, но немного похоже на:

Type itemType = ...;
IList list = (IList)Activator.CreateInstance(
    typeof(List<>).MakeGenericType(itemType));
list.Add(...);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...