c # размышляя о свойствах или других типах членов - PullRequest
1 голос
/ 09 июня 2011

Я использую инструмент под названием filehelpers, который на лету определяет класс для целей импорта файлов. Файл класса может выглядеть так:

[DelimitedRecord(",")]
[IgnoreFirst(1)]
public class TestNoPrimaryKey
{

[FieldConverter(ConverterKind.Decimal, ".")]
[FieldQuoted()]
public decimal Value;

[FieldQuoted('"', QuoteMode.OptionalForRead, MultilineMode.AllowForRead)]
public String aString;

}

Это правильно создано в коде из того, что я вижу. Затем мне нужно создать таблицу данных в сопоставимом формате, чтобы я мог выполнить вставку SQL. Благодаря доброй справке по SO, у меня есть этот код, который принимает тип (определенный выше) и подразумевает генерацию для меня типизированных столбцов с данными:

public static DataTable TypeToEmptyDataTable(Type myType)
{
    DataTable dt = new DataTable();

    foreach (PropertyInfo info in myType.GetProperties())
    {
        dt.Columns.Add(new DataColumn(info.Name, info.PropertyType));
    }

    return dt;
}

К сожалению, он не находит никаких свойств и возвращает данные без столбцов. Теперь я думаю - если получить; задавать; etc не указан в классе, может быть, они не являются «свойствами» как таковыми. Может быть, getMembers - это то, что мне нужно? Я пробовал это, но возвращая info.MemberType не работал.

Есть мысли о том, как вывести имена / типы из моего класса? Я не верю, что могу добавить get / set, потому что этот макет класса требуется для инструмента filehelpers, который я использую.

Спасибо!

Ответы [ 3 ]

6 голосов
/ 09 июня 2011

Вы не написали свойства в приведенном выше коде - вы объявили поля .get и set действительно имеют очень важное значение:)

Если вы хотите получить поля, просто используйте GetFields - но я бы рекомендовал вместо этого сделать их свойства.Свойства работают лучше с точки зрения связывания и т. Д., А также, как правило, лучше начинают в направлении инкапсуляции.

2 голосов
/ 09 июня 2011

Это дополнение к ответу @Jon Skeet ...........

Считайте значение ваших полей следующим образом:

Сейчас вы читаете свойства, а не поля классов

Type type = typeof(ReflectionTest); // Get type pointer
FieldInfo[] fields = type.GetFields(); // Obtain all fields
foreach (var field in fields) // Loop through fields
{
      ///you code 
}
0 голосов
/ 09 июня 2011

Использовать поле get с флагами привязки

myType.GetFields(System.Reflection.BindingFlags.Public |
             System.Reflection.BindingFlags.Static |
             System.Reflection.BindingFlags.Instance |
             System.Reflection.BindingFlags.FlattenHierarchy |
             System.Reflection.BindingFlags.GetField | System.Reflection.BindingFlags.GetProperty);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...