Member 11584373 Ответов: 1

Как создать observablecollection типа из DLL во время выполнения в VB.NET или с#


Assembly assembly = Assembly.LoadFrom("MyNice.dll");

Type classType = assembly.GetType("MyType");

object instanceOfMyType = Activator.CreateInstance(classType);

 var lstProjects=new ObservableCollection(type of instanceOfMyType here);?


Что я уже пробовал:

<pre><pre>public static List<T> MakeList<T>(T itemOftype)
        {
            List<T> newList = new List<T>();
            return newList;
        }       


но он возвращает список объектов

1 Ответов

Рейтинг:
2

Dave Kreskowiak

Так как вы загружаете .DLL во время выполнения вместо установки ссылки на нее вы теряете всю безопасность типов, включая возможность использования new ObservableCollection<MyType>() в вашем коде. Дженерики, подобные этому, - это концепция времени компиляции, а не времени выполнения.

Универсальный тип, например List<string>, это немного синтаксического сахара, короткий путь, если хотите. Для того чтобы этот код компилировался, вы должны иметь тип, доступный во время компиляции, чтобы компилятор мог генерировать правильный код в исполняемом файле.

Поскольку вы не собираетесь иметь тип, доступный во время компиляции (без ссылки), вы должны создать код для создания экземпляра коллекции самостоятельно. Имейте в виду, что вы все равно не получите никакой безопасности типов с этим и никакой помощи от Intellisense при написании вашего кода. Список, который вы получите обратно, будет List<object>, а не список указанного типа.

public static object CreateListOfType(this Type type)
{
    var listType = typeof(List<>);
    var listOfType = listType.MakeGenericType(type);
    var instance = Activator.CreateInstance(listOfType);

    return instance;
}