我正在使用一个名为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;
}
不幸的是,它找不到任何属性并返回没有列的数据表。现在我在想 - 如果得到的话;组;类没有在类中指定,也许它们本身不是“属性”。也许getMembers是我需要的?我尝试过,但返回info.MemberType不起作用。
有关如何从我的课程中获取姓名/类型的任何想法?我不相信我可以添加get / set,因为我正在使用的filehelpers工具需要该类布局。
谢谢!
答案 0 :(得分:6)
您尚未在上面的代码中编写任何属性 - 您已声明字段。 get
和set
确实产生了非常显着的差异:)
如果您想获取字段,只需使用GetFields
- 但我建议您改为使用属性。属性在绑定等方面效果更好,并且通常是更好的开始进行封装。
答案 1 :(得分: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
}
答案 2 :(得分:0)
将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);