Создание структуры из строки в C # - PullRequest
4 голосов
/ 09 января 2010

Я видел много вопросов о создании классов из строки, но не смог найти никакой информации о создании структуры таким же образом.

У меня есть класс, который содержит такую ​​структуру:

Public Structure callDetails
    Public GUID As Guid
    Public ringTime as Date
    Public CBN As String

и т.д.

Все, что я действительно хочу сделать, это получить имена полей из структуры. Мне все равно, манипулировать данными в полях.

Пока я могу довольно близко с этим подойти.

        callDetails callTableDef= new callDetails();

        Type tableType = callTableDef.GetType();

        object tableStruct = (object)Activator.CreateInstance(tableType);
        System.Reflection.FieldInfo[] fields = tableType.GetFields();
        foreach (System.Reflection.FieldInfo field in fields)
        Debug.WriteLine(field.Name + " = " + field.GetValue(tableStruct));

Однако мне все еще нужно создать экземпляр структуры с фактическим именем. Я хочу быть в состоянии передать в строку, как это:

Type tableType = System.Type.GetType("callDetails");

Когда я это делаю, я получаю ArgumentNullException от Activator.CreateInstance ()

Разве getType не должен искать переданное ему значение в виде строки и возвращать тип?

Я новичок в C #, программируя в основном на Java до этого проекта.

Ответы [ 3 ]

5 голосов
/ 09 января 2010

Вы должны указать имя типа с его пространством имен:

Type tableType = System.Type.GetType("mynamespace.callDetails");

Если он находится в другой сборке, вам нужно полное имя сборки. Подробности можно найти на MSDN . Если у вас есть только имя типа, оно не сможет быть разрешено и вернет null, следовательно, исключение NULL вашего аргумента.

1 голос
/ 09 января 2010

Если структура или класс доступны, то есть у вас есть ссылка на них, лучше использовать GetType, потому что вместо строки используется структура / класс. Это означает, что он потерпит неудачу во время компиляции, когда возникнет ошибка, а также даст вам лучшие возможности рефакторинга

Type tableType = GetType(callDetails)

В C #:

Type tableType = typeof(callDetails);
0 голосов
/ 09 января 2010

Спасибо, Дэвид,

Эта ссылка на MSDN была именно тем, что мне было нужно. Я пытался квалифицировать это столько раз, сколько я знал, как. Класс был в другой сборке. Я пытался

Type tableType = System.Type.GetType("CommonTables.callDetails");

без эффекта.

Для других, ищущих этот вопрос, вот что я должен был сделать:

После написания отладки:

Debug.WriteLine("DEBUG ASSEMBLY QUALIFIED NAME= " + callTableDef.GetType().AssemblyQualifiedName.ToString());

это дало мне это в качестве сборочного имени.

CommonTables.callDetails, callDetails, Version=3.0.4.0, Culture=neutral, PublicKeyToken=null

И эту строку мне пришлось использовать в методе getType (). только имя Assembly.class не работает.

...