c #, отражающий свойства или другие типы элементов

#c# #class #reflection #properties

#c# #класс #отражение #свойства

Вопрос:

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

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

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

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

}
  

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

 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;
}
  

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

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

Спасибо!

Ответ №1:

Вы не написали никаких свойств в приведенном выше коде — вы объявили поля. get И set действительно имеет очень существенное значение 🙂

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

Комментарии:

1. Отлично, большое спасибо, Джон. Если бы я использовал класс обычно, я бы, конечно, выбрал properties, но поскольку его целью в данном случае в значительной степени является определение файла, getfields звучит великолепно. Приветствия

Ответ №2:

Это дополнение к ответу @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 
}
  

Ответ №3:

Используйте поле 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);
  

Комментарии:

1. Я не смотрел на это, но проверю их. Спасибо 🙂