【问题标题】:Reflection returns backing fields of read-only properties?反射返回只读属性的支持字段?
【发布时间】:2017-04-10 17:55:28
【问题描述】:

如果像这样调用,Reflection 看起来会返回属性的支持字段:

type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)

有没有办法在没有任何支持字段/编译器生成的字段/等的情况下返回用户在类中声明的所有字段?

编辑:依赖[CompilerGenerated] 属性是否安全?

【问题讨论】:

  • 安全不是二元的。 “是否安全”的问题应该是“是否足够安全”,这反过来又会引发反问“对于什么来说足够安全?”考虑到可以在运行时动态创建类型,其中包含与编译时定义类型中的字段无法区分的字段。还要考虑在运行时创建此类类型的公共库,并且您的问题中没有关于您是否正在使用它们的信息。

标签: c# .net c#-6.0 .net-4.6 .net-4.6.2


【解决方案1】:

所有这些字段都标有 CompilerGeneratedAttribute,因此您可以像这样过滤:

var fields = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
            .Where(f => f.GetCustomAttribute<CompilerGeneratedAttribute>() == null).ToArray();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    • 2010-11-06
    • 2013-05-20
    • 2018-02-07
    相关资源
    最近更新 更多