2014-11-07 4 views
1

В настоящее время я делаю игру в 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.) 

Так что мой вопрос: Как создать новый экземпляр класса, используя строка? И как я могу передать в параметрах или «значений конструктора» для вновь созданного класса

Detailes Ниже здесь:

Класс MyClass наследует от (InventoryItem) класса InvItem, так что я могу держать разные классы в том же списке, поскольку все они должны быть элементами. Элементы разделены на разные классы, потому что я хочу, чтобы они имели разные способности/значения и команды.

Другой вопрос: Как мне создать класс как свой собственный тип/класс без каких-либо утверждений?

Как это:

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. 

Если я где-то неясно, или если вам нужна дополнительная информация, то просто сказать, что нужно.

Любая помощь приветствуется. Заранее спасибо.

+1

Сторона заметок; downcasting - кодовый запах. Вы должны попытаться определить, зачем вам это нужно; и избавиться от необходимости литья. – BradleyDotNET

+0

Почему бы не сделать класс, являющийся общим классом элементов. Затем вы сохраняете всю информацию в классе и сохраняете имя элемента и тип элементов, поэтому вам не нужно создавать классы, подобные этому? – deathismyfriend

+1

Добавить комментарий @deathismyfriend. Ваши объекты должны быть настроены так, чтобы полиморфизм заботился обо всех «конкретных» деталях. Вы никогда не должны заботиться о конкретном типе. – BradleyDotNET

ответ

0

Если вам нужно это сделать, вы, вероятно, ошибаетесь!

Хорошо, что сказал; Вам просто нужно перегрузку 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 действительно пытается быть безопасным по типу, и поведение, подобное этому, не является безопасным по типу.

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

+0

Можете ли вы привести пример того, как я использую myargs? – MasterXD

+0

Его массив объектов, вы просто передаете любые параметры, которые вы хотите там. Структура будет выбирать лучший конструктор для типа, основанный на типах, в которых вы проходили. Я не уверен, какой пример был бы помимо того, что я опубликовал. – BradleyDotNET

+0

Ok thx. : D Новая проблема, хотя ни тип, ни InvItem не содержат определения для Parse. Что я делаю XD? – MasterXD

Смежные вопросы