C# 获取反映对象状态的所有成员信息的最简单方法?

C# 获取反映对象状态的所有成员信息的最简单方法?,c#,reflection,automatic-properties,fieldinfo,C#,Reflection,Automatic Properties,Fieldinfo,我需要使用反射获取表示对象确切状态的所有成员。因此,这些成员包括字段(FieldInfo)和自动属性(PropertyInfo)。我可以使用 type.GetFields(); //ok some flags needed here 并获取自动实现的属性,如下所述: 正如回答者所说,这确实是脆弱的。有没有更标准的方法来实现这一点?我在想,可能是带有BindingFlags之类的东西 type.GetMembers(BindingFlags....) ? 如果“对象的确切状态”只是指它包含的所

我需要使用反射获取表示对象确切状态的所有成员。因此,这些成员包括字段(
FieldInfo
)和自动属性(
PropertyInfo
)。我可以使用

type.GetFields(); //ok some flags needed here
并获取自动实现的属性,如下所述:

正如回答者所说,这确实是脆弱的。有没有更标准的方法来实现这一点?我在想,可能是带有
BindingFlags
之类的东西

type.GetMembers(BindingFlags....) ?
如果“对象的确切状态”只是指它包含的所有实例字段(如果不是,您能澄清一下吗?),那么您应该能够用一条语句来实现这一点——您显式声明的字段与编译器为您添加的自动属性的支持字段之间没有显著差异。如果定义一个类:

public class FieldInfoTest
{
  private string testField;

  public string TestProperty { get; set; }
}
…您可以使用

FieldInfo[] fields = typeof(FieldInfoTest).GetFields(BindingFlags.Instance |
                                                     BindingFlags.Public | 
                                                     BindingFlags.NonPublic);

foreach (var f in fields)
{
  Console.WriteLine(f.Name);
}
这将产生:

testField
<TestProperty>k__BackingField
testField
k__BackingField

杰里米的答案是我能得到的最好答案。下面是另一种选择(我最初在问题中提到):

公共静态IEnumerable GetState成员(此类型为t)
{
返回t.GetMembers(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)

.Where(m=>m.MemberType==MemberTypes.Field&&!((FieldInfo)m).Name.Contains('这是针对特定对象类型的,还是针对任何对象类型的?如果您希望获取特定类型的状态,并且拥有它们的代码,可以添加您自己的特殊属性[ObjectState]标记那些fields@omerschleifer对于任何对象类型。我都在考虑一般性地处理它,而不是去修改所有这些类。是否需要将自动属性支持字段与常规字段区别对待?根据我的经验,
GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
会抓住他们。还是我误解了这个问题?@JeremyTodd不,我不需要区别对待他们,我只需要他们。让我试试你的例子。如果成功,我会通知你,你可以回答:)@nawfal不确定您想要“面向公众”做什么,但听起来好像您正试图编写自己的序列化过程来将文件输出到文本(或类似文本)从其他应用程序导入/导出的文件。在这种情况下,搜索
序列化
对于基于二进制、xml和json的格式,工作已经完成。Jeremy,+1的想法可能适用于我的情况。但我希望改为获取属性(如
PropertyInfo
)@nawfal您对auto属性有什么特别的兴趣吗?我的意思是,除了它们是由编译器sugar实现之外,它们几乎和引擎盖下的常规属性一样。在我的例子中,我需要一个AutoProperty的句柄,因为它们是独立的成员(至少来自外部世界)例如,如果有一个像这样的
Person
类:
int-age;int-age{get{return age;}}}字符串名{get;set;}
,那么哪些属性决定了对象的特定状态?它必须是字段(因为它们构成属性的基础;从外部暴露其他内容)和没有支持字段的自动属性-因此,对于我来说,
age
Name
。自动属性确实有支持字段。Jeremy,它们有,这就是我使用“外部世界”的原因首先,我希望你能理解我为什么特别需要汽车属性。因为,正如你所说,它们在任何意义上都是隐藏在引擎盖下的属性,如果我把它们作为属性本身来获取,那就太好了。
testField
<TestProperty>k__BackingField
public static IEnumerable<MemberInfo> GetStateMembers(this Type t)
{
    return t.GetMembers(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
            .Where(m => m.MemberType == MemberTypes.Field && !((FieldInfo)m).Name.Contains('<')
                     || m.MemberType == MemberTypes.Property && ((PropertyInfo)m).IsAutoProperty());
}

public static bool IsAutoProperty(this PropertyInfo prop)
{
    if (!prop.CanWrite || !prop.CanRead)
        return false;

    return prop.DeclaringType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
                             .Any(f => f.Name.Contains("<" + prop.Name + ">"));
}