Я пытаюсь создать универсальный список объектов с помощью отражения. Ниже бросков кода ошибка не Может создать экземпляр интерфейса.. Я мог изменить IList для Списка, и он хорошо работает, но я задавался вопросом, существует ли способ получить эту работу с IList.
var name = typeof (IList<T>).AssemblyQualifiedName;
Type type = Type.GetType(name);
var list = Activator.CreateInstance(type);
вам нужно будет создать конкретный класс, поэтому, если вы сделаете
var type = Type.GetType(typeof (List<T>).AssemblyQualifiedName);
var list = (Ilist<T>)Activator.CreateInstance(type);
, все будет успешно (если вы укажете допустимое значение для T, равное курс).
Метод Activator.CreateInstance
вызывает конструктор по умолчанию для создания экземпляра типа, переданного в качестве параметра. Для успешного выполнения этой функции этот тип должен быть неабстрактным, а не интерфейсным и иметь конструктор по умолчанию.
Ну нет, это невозможно. Сообщение об ошибке является кристально чистым. Невозможно создать экземпляр интерфейса.
Откуда она знает, какой конкретный класс вы хотите получить? Часто многие классы реализуют один и тот же интерфейс. Должен ли он просто выбрать один наугад?; -)
Это не имеет ничего общего с отражением, так как вы бы не смогли «создать» интерфейс обычно тоже. Присваивайте только объекты, реализующие интерфейс, а затем передавайте ссылку на интерфейс.
-121--4099437-Нет, невозможно создать экземпляр интерфейса.
Как .NET (или, скорее, метод Activator.CreateInstance) может решить, какую реализацию этого интерфейса он должен создать?
Вы тоже не можете сделать:
IList<int> l = new IList<int>();
, не так ли? Вы просто не можете создать экземпляр интерфейса, так как интерфейс - это определение или контракт, который описывает, какие функции должен реализовать тип.
Я не думаю, что у вас получится заставить это работать, потому что вы не знаете, какой тип объекта вам нужно создать.
У вас будет такая же проблема с абстрактным классом.
IList<T> Create<T>()
{
Type baseListType = typeof(List<>);
Type listType = baseListType.MakeGenericType(typeof(T));
return Activator.CreateInstance(listType) as IList<T>;
}
Метод Activator.CreateInstance
вызывает конструктор по умолчанию для создания экземпляра типа, переданного в качестве параметра. Этот тип должен быть не абстрактным, а не интерфейсным и иметь конструктор по умолчанию, чтобы эта функция работала успешно.
Нет, это невозможно. Сообщение об ошибке кристально четкое. Вы не можете создать экземпляр интерфейса.
Как он узнает, какой именно класс вам нужен? Часто многие классы реализуют один и тот же интерфейс. Должен ли он просто выбрать одно наугад? ; -)
Это не имеет ничего общего с отражением, так как вы также не сможете «создать экземпляр» интерфейса обычным образом. Назначайте только объекты, реализующие интерфейс, а затем передайте ссылку на интерфейс.
Очевидно, что объект типа IList
нельзя инстанцировать непосредственно потому, что он является типом интерфейса.
Попробуйте инстанцировать Список
, а затем, возможно, вернуть его в виде IList
.
Ну, вы МОЖЕТЕ создать экземпляр интерфейса на 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