Создание универсального экземпляра IList с помощью отражения

Я пытаюсь создать универсальный список объектов с помощью отражения. Ниже бросков кода ошибка не Может создать экземпляр интерфейса.. Я мог изменить IList для Списка, и он хорошо работает, но я задавался вопросом, существует ли способ получить эту работу с IList.

    var name = typeof (IList<T>).AssemblyQualifiedName;

    Type type = Type.GetType(name);

    var list = Activator.CreateInstance(type);
6
задан Kumar 4 February 2010 в 10:45
поделиться

8 ответов

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

var type = Type.GetType(typeof (List<T>).AssemblyQualifiedName);
var list = (Ilist<T>)Activator.CreateInstance(type);

, все будет успешно (если вы укажете допустимое значение для T, равное курс).

7
ответ дан 8 December 2019 в 03:00
поделиться

Метод Activator.CreateInstance вызывает конструктор по умолчанию для создания экземпляра типа, переданного в качестве параметра. Для успешного выполнения этой функции этот тип должен быть неабстрактным, а не интерфейсным и иметь конструктор по умолчанию.

-121--4099435-

Ну нет, это невозможно. Сообщение об ошибке является кристально чистым. Невозможно создать экземпляр интерфейса.

Откуда она знает, какой конкретный класс вы хотите получить? Часто многие классы реализуют один и тот же интерфейс. Должен ли он просто выбрать один наугад?; -)

Это не имеет ничего общего с отражением, так как вы бы не смогли «создать» интерфейс обычно тоже. Присваивайте только объекты, реализующие интерфейс, а затем передавайте ссылку на интерфейс.

-121--4099437-

Нет, невозможно создать экземпляр интерфейса.

Как .NET (или, скорее, метод Activator.CreateInstance) может решить, какую реализацию этого интерфейса он должен создать?

Вы тоже не можете сделать:

IList<int> l = new IList<int>();

, не так ли? Вы просто не можете создать экземпляр интерфейса, так как интерфейс - это определение или контракт, который описывает, какие функции должен реализовать тип.

9
ответ дан 8 December 2019 в 03:00
поделиться

Я не думаю, что у вас получится заставить это работать, потому что вы не знаете, какой тип объекта вам нужно создать.

У вас будет такая же проблема с абстрактным классом.

3
ответ дан 8 December 2019 в 03:00
поделиться
IList<T> Create<T>()
{
    Type baseListType = typeof(List<>);
    Type listType = baseListType.MakeGenericType(typeof(T));
     return Activator.CreateInstance(listType) as IList<T>;
}
2
ответ дан 8 December 2019 в 03:00
поделиться

Метод Activator.CreateInstance вызывает конструктор по умолчанию для создания экземпляра типа, переданного в качестве параметра. Этот тип должен быть не абстрактным, а не интерфейсным и иметь конструктор по умолчанию, чтобы эта функция работала успешно.

6
ответ дан 8 December 2019 в 03:00
поделиться

Нет, это невозможно. Сообщение об ошибке кристально четкое. Вы не можете создать экземпляр интерфейса.

Как он узнает, какой именно класс вам нужен? Часто многие классы реализуют один и тот же интерфейс. Должен ли он просто выбрать одно наугад? ; -)

Это не имеет ничего общего с отражением, так как вы также не сможете «создать экземпляр» интерфейса обычным образом. Назначайте только объекты, реализующие интерфейс, а затем передайте ссылку на интерфейс.

2
ответ дан 8 December 2019 в 03:00
поделиться

Очевидно, что объект типа IList нельзя инстанцировать непосредственно потому, что он является типом интерфейса.

Попробуйте инстанцировать Список, а затем, возможно, вернуть его в виде IList.

2
ответ дан 8 December 2019 в 03:00
поделиться

Ну, вы МОЖЕТЕ создать экземпляр интерфейса на C #. Но только если вы на самом деле расскажете, как это сделать.

См. http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.coclassattribute.aspx и http://blogs.msdn.com/ brada / archive / 2004/10/10 / 240523.aspx

Однако в вашем случае кажется, что вы неправильно поняли, как работают интерфейсы.

Просто создайте список, а затем верните IList , и ваш вызывающий код не позаботится о том, что вы на самом деле используете List .

0
ответ дан 8 December 2019 в 03:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: