Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > работа с типами "на лету"


Автор: bullterier 15.2.2008, 16:09
Пусть в процессе работы программа выдает список типов некоей сборки.

Type [] types;
.....
sborka = Assembly.LoadFrom(SomePath);
types = sborka.GetExportedTypes();


требуется создать экземпляр класса SomeClass<TSomeType>, такой, чтобы typeof(TSomeType) соответствовал некоему заданному типу из массива types.

Просьба делиться лишь проверенными решениями.


Автор: Crimp 15.2.2008, 17:34
пример создания на лету
Код

Assembly assembly = Assembly.LoadWithPartialName("Microsoft.VisualStudio.Package.LanguageService");
Type type = assembly.GetType("Microsoft.VisualStudio.Package.DropDownMember");
object obj = Activator.CreateInstance(type);


только не надо забывать что вся эта замута на GetType() и тд. очень сильно тормозит :( так что, неплохобы знать об объектах заранее, или делать через интерфейсы.
Reflection это долго, и геморно.

Автор: tol05 15.2.2008, 18:02
Цитата(bullterier @  15.2.2008,  15:09 Найти цитируемый пост)
Просьба делиться лишь проверенными решениями.

bullterier, не соизволите ли принять и мой вариант? ИМХО, как раз "проверенное решение" ... может быть недостаточно тщательно конечно...

класс-генерик
Код

class MyClass<T>
    {
        T t;
        
        public T TValue
        {
            set
            {
                t = value;
            }
            get
            {
                return t;
            }
        }
    }

использование
Код

//Здесь мы будем хранить созданные экземпляры
List<object> list = new List<object>();

//Это список типов (для использования как generic type parameter)
Type [] types = new Type[]{typeof(string), typeof(int), typeof(bool)};

//Создаем основной тип
Type mainType = typeof(MyClass<>);

Type genericType;
            
foreach (Type type in types)
{
    //делаем основной тип генериком, заполненным конкретным типом
    genericType = mainType.MakeGenericType(type);

    //Создаем экземпляр генерика с конкретным типом-параметром и добавляем его в наш список.
    list.Add(Activator.CreateInstance(genericType));
}    

Автор: bullterier 16.2.2008, 16:26
Спасибо, братцы! Все заработало.  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)