Используя тип, возвращаемый 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. Поэтому я думаю, что у вас нет преимущества перед использованием только не общего списка.