2009-12-01 2 views
9

Судя по названию этого вопроса, я хочу, чтобы это было невозможно, поэтому я опишу, что я делаю, и вы можете свободно сообщить мне, что я делаю, я делаю неправильно и что будет лучшим способом для достижения моей цели.C# Тип литья во время выполнения с использованием отражения

У меня есть XML-файл, который описывает 1) пользовательский объект, который является производным базового типа, и 2) имена внутренних полей и связанные с ними значения. Эти производные объекты могут иметь дополнительные поля, о которых базовый класс не знает.

Я извлекаю тип объекта в виде строки, и я помещаю все данные объекта в словарь, где ключ - это имя поля, а значение - значение поля. Я создаю экземпляр объекта, используя имя строки и конструктор по умолчанию для объекта. Я могу вынюхивать все свойства объекта в PropertyInfo []. Теперь мне нужно взять все значения, которые находятся в строковой форме, и преобразовать их в правильные типы данных, чтобы я мог загрузить их в свойства объекта. (Поскольку я печатаю это, это звучит так, будто я беру какое-то состояние сохранения и восстанавливаю его, но я только слышал об этом. Если вы хотите посоветовать в этом направлении, пожалуйста, имейте в виду, что Я застрял в чтении данных из файла XML, и я не могу его изменить.)

Я могу преобразовать все строковые значения в тип, заданный объектом типа, и используя функцию грубой силы, которую я сделал имеющий следующее определение:

public object convertMe(string v, Type t) 

Так как я не знаю, что Тип Я устраиваю на функцию, я не знаю, что вернется и я не могу явно привести Объект для соответствующего типа для присвоения вышеупомянутого свойства. Я пытать следующий вид слепков без толка:

string objectType = /*read type string from XML*/; 

... // Wherein I instantiate an object "theObject" and get PropertyInfo[] from it. 
... // I also make sure that I'm trying to assign the correct data to 
... // the correct property. 

Type t = currentProperty.PropertyType; 
object o = convertMe(value, Type.GetType(qtype)); 
currentProperty.SetValue(theObject, (t)o, null); // Doesn't work 
currentProperty.SetValue(theObject, (t)Convert.ChangeType(o, t), null); // Doesn't work. Apparently (t) is bad syntax. 

В конце концов, моя цель состоит в том, чтобы создать экземпляр объекта и загрузить его с данными из файла XML таким образом, что типы данных Арена жестко закодирован. Причина, по которой я делаю это в C#, заключается в том, что раньше это была программа Python, и мне было назначено перевести ее на C# .NET 2.0. По крайней мере, это опыт обучения. Причина, по которой я создал эту функцию «грубой силы», заключается в том, что я искал способ этой проблемы кастинга, но независимо от того, что я пытаюсь, я не могу заставить ее работать. Я мог бы сделать это самостоятельно, используя чистую силу, но я решил, что должно быть элегантное решение, которое мне не хватает.

Любая помощь очень ценится!

ответ

14

Вам вообще не нужны никакие броски. PropertyInfo.SetValue принимает аргумент типа object, поэтому просто передайте ему o, и все будет.

+0

Хорошо, что я умер. Я собираюсь сделать это до слепоты.Хотя в документах MSDN сказано, что для этого потребовался объект, каждый пример, показывающий его использование, использовал правильный тип значения, поэтому я никогда не делал этого соединения. Большое спасибо! – Sanjamal

5

Вам вообще не нужна акция. Кастинг полезен только тогда, когда вы пытаетесь разобраться с объектами напрямую, а не когда используете отражение.

Когда вы идете установить свойство, вы используете PropertyInfo.SetValue. В качестве параметра значения принимает значение object, поэтому нет необходимости пытаться принудить его к определенному типу (пока объект уже является правильным типом).

Поскольку вы уже сделали «convertMe», который помещает объект в правильный тип (лить или помещать в коробку в Object), вы все настроены - просто используйте его.

+0

Большое вам спасибо! – Sanjamal