Используя тип, возвращаемый Type.GetType() в С#
У меня вопрос о том, как это возможно (если возможно:)
использовать ссылку типа, возвращаемую Type.GetType(), чтобы, например, создать IList этого типа?
здесь пример кода:
Type customer = Type.GetType("myapp.Customer");
IList<customer> customerList = new List<customer>(); // got an error here =[
Благодарим вас в Advance!
Ответы
Ответ 1
Что-то вроде этого:
Type listType = typeof(List<>).MakeGenericType(customer);
IList customerList = (IList)Activator.CreateInstance(listType);
Конечно, вы не можете объявить его как
IList<customer>
потому что он не определен во время компиляции. Но List<T>
реализует IList, поэтому вы можете использовать это.
Ответ 2
Недавно я столкнулся с этой проблемой. Я понимаю, что это старый вопрос, но подумал, что кто-то может найти полезное решение, которое я нашел (используя net 4.0).
Это настройка, которую я имел:
public interface ISomeInterface{
String GetEntityType{ get; }
}
public abstract class BaseClass : ISomeInterface{
public String GetEntityType {
get{ return this.GetType().ToString(); }
}
}
public class ChildA : BaseClass { }
public class ChildB : BaseClass { }
Что я сделал, так это создать метод factory:
public static dynamic GetRealType { ISomeInterface param } {
return Activator.CreateInstance("dllname", param.GetEntityType);
}
Создание объекта в качестве динамического типа было тем, что решило его для меня. Я предположил тип с помощью метода:
public void DoSomething<T>(T param){
IList<T> list = somecode...
}
это позволило мне сделать вызов метода и позволить .net вывести тип
public void myMethod( ISomeInterface param ) {
dynamic value = Factory.GetRealType ( param );
DoSomething(value);
}
Надеюсь, я не сделал все это запутанным, и это на самом деле помогает, также, извините за стену текста
Ответ 3
Решение вашей проблемы уже предоставляется Stefan.
Причина, по которой вы не можете выполнить IList<customer>
, заключается в том, что вы не можете смешивать время компиляции и типы времени выполнения таким образом.
Подсказка, когда я пытаюсь рассуждать о чем-то вроде этого: как может intellisense выяснить, какие участники должны показать. В вашем примере это может быть разрешено только во время выполнения.
Может быть использован ответ Штефана. Однако я думаю, что это не помогает в вашей основной проблеме, потому что это не дает вам intellisense. Поэтому я думаю, что у вас нет преимущества перед использованием только не общего списка.