Как использовать строки типа .NET в моих программах? - PullRequest
1 голос
/ 07 сентября 2010

Например, в .NET app.config вы можете получить

<configuration>
   <configSections>
      <section name="MyConfig" type="MyAssembly.MyType, MyAssembly, PublicKeyToken=null" />
   </configSections>
   ...
</configuration>

Сигнатура в части типа, кажется, стандартизирована в различных местах .NET, но я понятия не имею, как это сделатьв моих собственных программах.Я использовал System.Activator в своих программах, но мне кажется, что я дублирую работу, которую уже делает .NET.

С точки зрения программирования, как мне это сделать:

void Main()
{
   object instance = CreateInstance("MyAssembly.MyType, MyAssembly, PublicKeyToken=null");
   Console.WriteLine(instance.GetType().Name);
}

object CreateInstance(string dotNetTypeSignature)
{
   // Code goes here.
}

Ответы [ 3 ]

4 голосов
/ 07 сентября 2010

Вы можете вызвать метод Type.GetType , чтобы получить объект Type с заданным именем (с указанием сборки).

Вы можете вызвать Activator.CreateInstance метод , чтобы создать экземпляр типа. (при условии, что тип имеет открытый конструктор по умолчанию или что вы знаете, какие аргументы конструктора ему нужны).

Например:

Activator.CreateInstance(Type.GetType(name));
0 голосов
/ 07 сентября 2010

Полное имя типа обычно используется для «поздней» привязки к определенному типу. В имеющемся примере файла конфигурации фактический тип раздела конфигурации не был известен во время сборки CLR, поэтому ConfigurationManager должен прочитать фактический тип из файла конфигурации и выполнить его очистку во время выполнения. Это делается с использованием класса System.Activator, как вы упомянули, и это стандартный способ сделать это в мире .Net.

Конечно, если тип, для которого вы хотите создать экземпляр, известен во время сборки, вы должны просто сослаться на сборку, которая его содержит, и использовать new. Однако, если вы хотите реализовать расширяемость во время выполнения, такую ​​как ConfigurationManager, вы должны использовать методы Activator CreateInstance или CreateInstanceFrom, которые имеют переопределения, которые позволяют передать точную строку, прочитанную из любой используемой конфигурации, или экземпляр Type, который также может быть создан из той же строки.

И, конечно, есть и другая сторона, где любая реализация вашей точки расширяемости должна выписать полное имя типа. Для этого вы можете использовать typeof(MyType).FullName или myInstance.GetType().FullName.

0 голосов
/ 07 сентября 2010

Эти разделы обычно создаются / открываются с помощью дизайнера настроек Visual Studio.

В обозревателе решений найдите Свойства-> Настройки.settings или щелкните правой кнопкой мыши имя проекта-> Свойства-> Настройки.

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