Создать новый экземпляр класса, используя строку

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.)

Поэтому мой вопрос: как создать новый экземпляр класса, используя строку? И как я могу передать параметры или "значения конструктора" для вновь созданного класса

Детали ниже:

Класс 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.

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

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

  • 1
    Примечание; уныние это кодовый запах. Вы должны попытаться определить, зачем вам это так нужно; и избавиться от необходимости кастинга.
  • 0
    Почему бы не сделать класс, который является общим классом предметов. Затем вы сохраняете всю информацию в классе и сохраняете имя и тип элементов, чтобы вам не нужно было создавать такие классы?
Показать ещё 8 комментариев
Теги:
xna

1 ответ

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?
  • 0
    Это массив объектов, вы просто передаете туда любые параметры, которые хотите. Фреймворк выберет лучший конструктор для типа, основываясь на типах, которые вы передали. Я не уверен, что будет примером, помимо того, что я опубликовал.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню