Я делаю систему на основе компонентов (каждый объект делегирует всю функциональность различным компонентам, которые могут быть добавлены во время выполнения) и хочу иметь возможность легко определять мои объекты в файлах 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 выглядели как можно ближе к первому решению? Если нет, то является ли второе решение жизнеспособным?