在 C# 中通过反射从对象获取字段和值

本文关键字:获取 对象 字段 反射 | 更新日期: 2023-09-27 18:36:24

通过下面的类,我尝试得到:

  • 字段名称
  • 价值

我尝试了这段代码:

Dictionary<string, string> listField = 
        membership.GetType()
            .GetFields(BindingFlags.NonPublic)
            .ToDictionary(f => f.Name,
                          f => (string)f.GetValue(null));

但我字典里什么都没有。

知道吗?

  [System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name="MyClass", Namespace="http://model.common.party.ent.gfdi.be")]
[System.SerializableAttribute()]
public partial class MyClass : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged {
    [System.NonSerializedAttribute()]
    private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
    [System.Runtime.Serialization.OptionalFieldAttribute()]
    private string firstName;
    [System.Runtime.Serialization.OptionalFieldAttribute()]
    private string lastName;
    [System.Runtime.Serialization.OptionalFieldAttribute()]
    private System.Nullable<long> fieldA;   
    [System.Runtime.Serialization.OptionalFieldAttribute()]
    private bool fieldB;    
    [System.Runtime.Serialization.OptionalFieldAttribute()]
    private int fieldC;     
}

在 C# 中通过反射从对象获取字段和值

是的,我认为这将起作用:

Dictionary<string, string> listField =
membership.GetType()
         .GetFields(BindingFlags.NonPublic | BindingFlags.Instance) // <-- specify that you want instance fields
         .ToDictionary(f => f.Name,
                       f => (string)f.GetValue(membership)); // <-- IMPORTANT, 
                       // you need to specify an instance to get a value from a non-static field

上面的代码仅适用于未经修改的实例字段

试试这个

const BindingFlags Flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;