Судя по названию этого вопроса, я хочу, чтобы это было невозможно, поэтому я опишу, что я делаю, и вы можете свободно сообщить мне, что я делаю, я делаю неправильно и что будет лучшим способом для достижения моей цели.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. По крайней мере, это опыт обучения. Причина, по которой я создал эту функцию «грубой силы», заключается в том, что я искал способ этой проблемы кастинга, но независимо от того, что я пытаюсь, я не могу заставить ее работать. Я мог бы сделать это самостоятельно, используя чистую силу, но я решил, что должно быть элегантное решение, которое мне не хватает.
Любая помощь очень ценится!
Хорошо, что я умер. Я собираюсь сделать это до слепоты.Хотя в документах MSDN сказано, что для этого потребовался объект, каждый пример, показывающий его использование, использовал правильный тип значения, поэтому я никогда не делал этого соединения. Большое спасибо! – Sanjamal