используя тип, возвращаемый Type.GetType () в c # - PullRequest
14 голосов
/ 27 мая 2009

У меня вопрос о том, как это возможно (если возможно :) использовать ссылку на тип, возвращенную Type.GetType (), например, для создания IList этого типа?

вот пример кода:

Type customer = Type.GetType("myapp.Customer");
IList<customer> customerList = new List<customer>(); // got an error here =[

Заранее спасибо!

Ответы [ 3 ]

22 голосов
/ 27 мая 2009

Примерно так:

Type listType = typeof(List<>).MakeGenericType(customer);
IList customerList = (IList)Activator.CreateInstance(listType);

Конечно, вы не можете объявить это как

IList<customer>

потому что он не определен во время компиляции. Но List<T> реализует IList, так что вы можете использовать это.

2 голосов
/ 18 января 2012

Я недавно столкнулся с этой проблемой. Я понимаю, что это старый вопрос, но подумал, что кто-то может найти полезное решение, которое я нашел (используя 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 {  }

Я создал фабричный метод:

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);
}

Надеюсь, меня это не смущало, и на самом деле это помогает, извините за стену текста

0 голосов
/ 27 мая 2009

Решение вашей проблемы уже предоставлено Стефаном.

Причина, по которой вы не можете сделать IList<customer>, заключается в том, что вы не можете смешивать типы времени компиляции и времени выполнения таким образом. Подсказка, когда я пытаюсь рассуждать о чем-то вроде этого: как intellisense может выяснить, каких членов он должен показать. В вашем примере это может быть решено только во время выполнения.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...