Создание экземпляров из строк в разных пространствах имен и разных сборках - PullRequest
0 голосов
/ 07 июня 2011

Я делаю систему на основе компонентов (каждый объект делегирует всю функциональность различным компонентам, которые могут быть добавлены во время выполнения) и хочу иметь возможность легко определять мои объекты в файлах XML. Я знаю, как использовать Activator.CreateInstance для создания своих объектов из строк, но мне требуются полные имена классов и имена сборок.

Проблема заключается в том, что эти компоненты могут быть предварительно встроены в мою библиотеку (скажем, сборка FirstAssembly.dll и пространство имен Foo.Bar) или определены специально для моей игры (скажем, сборка SecondAssembly.dll и пространство имен Second.Blah ).

//In some assembly FirstAssembly.dll

namespace Foo.Bar
{
class SomeClassA
{
}

class SomeClassB
{
}
}

//In some assembly SecondAssembly.dll

namespace Second.Blah
{
class SomeClassC
{
}

class SomeClassD
{
}
}

//In my XML..I would much prefer
<class="SomeClassA"...> </class>
<class="SomeClassD"...> </class>

//Over this, which would just need to check FirstAssembly and SecondAssembly and error handle
<class="Foo.Bar.SomeClassB"...></class>
<class="Second.Blah.SomeClassD"...></class>

//Which I would much prefer over
<class="Foo.Bar.SomeClassB" assembly="FirstAssembly"...></class>
<class="Second.Blah.SomeClassD" assembly="SecondAssembly"...></class>

Последнее решение было бы простым, хотя и довольно раздражающим - мне нужны имена сборок или, по крайней мере, какой-то способ сказать «компонент из библиотеки» или «компонент из игры».

Второе решение, вероятно, проще - мне просто нужно (каким-то образом) проверить - возможно, просто try/catch - если класс находится в FirstAssembly; если нет, попробуйте SecondAssembly.

Первое решение - это то, что я действительно хочу сделать, но я не думаю, что это возможно. Количество пространств имен усложнит задачу.

tl; dr Можно ли заставить эту систему работать так, чтобы мои файлы XML выглядели как можно ближе к первому решению? Если нет, то является ли второе решение жизнеспособным?

1 Ответ

1 голос
/ 07 июня 2011

Звучит так, будто вы хотите что-то вроде:

Type targetType = (from assembly in candidateAssemblies
                   from type in assembly.GetTypes()
                   where type.Name == nameFromXml
                   select type).FirstOrDefault();

Обратите внимание, что:

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