c# - 反射(reflection):从 PropertyInfo 获取 FieldInfo

标签 c# reflection

我正在使用反射生成一些动态代码,我遇到过这样一种情况,我需要获取属性的支持字段(如果它有的话)以便使用它的 FieldInfo 对象。

现在,我知道你可以使用

.IsDefined(typeof(CompilerGeneratedAttribute), false);

在 FieldInfo 上发现它是否是自动生成的,所以我假设自动生成字段的 Properties 也有类似的东西?

干杯,埃德

最佳答案

get_set_属性的方法也得到 CompilerGeneratedAttributed应用于他们。虽然通过属性没有强耦合,但有一个命名约定用于自动属性的支持字段:

public string Foo { get; set;}

产生 private string <Foo>k__BackingField成员(此处的 <> 是名称的一部分,因为它们在 IL 中合法但在 C# 中不合法;它们与泛型无关)。

例如,这将获得一个类中所有自动属性的列表,以及它们的支持字段:

t.GetProperties().Where(p => 
    (p.GetGetMethod() ?? p.GetSetMethod()).IsDefined(typeof(CompilerGeneratedAttribute), false))
   .Select(p => new 
   { 
      Property = p, 
      Field = t.GetField(string.Format("<{0}>k__BackingField", p.Name),
          System.Reflection.BindingFlags.NonPublic | 
          System.Reflection.BindingFlags.Instance) 
   });

关于c# - 反射(reflection):从 PropertyInfo 获取 FieldInfo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2675975/

相关文章:

c# - 手动发布 ClickOnce

c# - 如何使用特定参数指定任务 ("A").IsDependantOn ("B")

C# Reflection - 如何为结构设置字段值

c# - 在运行时更改属性的参数

c# - 如何找到基类的直接后代类型?

c# - 单击桌面快捷方式时从系统托盘恢复应用程序

c# - Mono 上的 SslStream 未完全关闭

c# - 字典到 ListView TwoWay 绑定(bind) - 可能吗?

java - 返回枚举作为对象类型

类级别变量上的 Python 装饰器作为反射的元数据?