【问题标题】:c# reflecting on properties or other member typesc# 反映属性或其他成员类型
【发布时间】:2011-09-11 15:43:21
【问题描述】:

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

谢谢!

【问题讨论】:

    标签: c# class reflection properties


    【解决方案1】:

    使用带有绑定标志的 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);
    

    【讨论】:

    • 我没有看过这些,但会检查出来。谢谢:)
    【解决方案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】:

      您没有在上面的代码中编写任何属性 - 您已经声明了字段getset 确实有很大的不同:)

      如果您想获取字段,只需使用GetFields - 但我建议您改为将它们设为属性。属性在绑定等方面效果更好,并且通常是更好的开始封装。

      【讨论】:

      • 完美,非常感谢乔恩。如果我通常使用该类,我当然会使用属性,但是由于在这种情况下它的目的几乎是文件定义,因此 getfields 听起来很棒。干杯
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-10
      • 2020-05-02
      • 1970-01-01
      相关资源
      最近更新 更多