#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. Я не смотрел на это, но проверю их. Спасибо 🙂