c#反映属性或其他成员类型

时间:2011-06-09 12:00:01

标签: c# class reflection properties

我正在使用一个名为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工具需要该类布局。

谢谢!

3 个答案:

答案 0 :(得分:6)

您尚未在上面的代码中编写任何属性 - 您已声明字段getset确实产生了非常显着的差异:)

如果您想获取字段,只需使用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);