В настоящее время я делаю игру в XNA, и я пытаюсь найти способ создания класса с помощью строки. Я хочу, чтобы он работал примерно так:
string classtype = "DrillTool"; //classtype/classname
InvItem item = new .... ("DrillTool"); //this is where i'm lost!
Класс DrillTool выглядит следующим образом:
class DrillTool : InvItem
//The constructor is something like this
public DrillTool(string itemName, string spriteName, string storedBatteryPower etc.)
Поэтому мой вопрос: как создать новый экземпляр класса, используя строку? И как я могу передать параметры или "значения конструктора" для вновь созданного класса
Детали ниже:
Класс MyClass наследуется от класса InvItem (InventoryItem), поэтому я могу хранить разные классы в одном списке, поскольку все они должны быть элементами. Элементы разделены на разные классы, потому что я хочу, чтобы они имели разные способности/значения и команды.
Другой вопрос: как я могу использовать класс как свой собственный тип/класс без каких-либо операторов if?
Как это:
InvItem drillItem = new DrillTool(etc.);
(Typeof(drillItem))drillItem.valueThatOnlyExistsInDrillToolClass; //?
//I can't access the DrillTool values of drillItem if it has not been "converted".
И не это:
if (drillItem.GetType() == typeof(DrillTool))
{
currentItem = (DrillTool)drillItem;
currentItem.valueThatOnlyExistsInDrillToolClass;
}
else if (etc.) //I am gonna end up with over 20 classes at least.
Если я где-то неясен или вам нужна дополнительная информация, просто сообщите, что нужно.
Любая помощь приветствуется. Заранее спасибо.
Если вам нужно это сделать, вы, вероятно, ошибаетесь!
Хорошо, это сказано; вам просто нужна перегрузка Activator.CreateInstance
(MSDN)
Type myType = Type.GetType(typeString);
object obj = Activator.CreateInstance(myType, myargs, "MyOtherStringArgs");
Я не совсем понимаю ваш второй вопрос; этот актер будет работать:
DrillTool tool = (DrillTool)obj;
Конечно, он будет бросать, если приведение недействительно. Для исключения этих исключений вам нужны инструкции if (с использованием is
или typeof
). Вы также можете использовать это:
DrillTool tool = obj as DrillTool;
Который будет возвращать null
если сбой выполняется.
Вы не можете использовать "динамический" тип (без использования dynamic
ключевого слова). Это поведение не поддерживается/разрешено в.NET. Обоснование должно быть очевидным; что, если строка отличается, а результирующий тип не имеет специального свойства? .NET действительно пытается быть безопасным по типу, и поведение, подобное этому, не является безопасным по типу.
Кажется, вы сталкиваетесь с болью в этом; который должен стать показателем моего первого предложения. Вы действительно никогда не должны этого делать. Существует несколько действительных вариантов использования; Я искренне сомневаюсь, что у вас есть один из них.