【问题标题】:Get fields and values from an object by reflection in C# [duplicate]通过C#中的反射从对象中获取字段和值[重复]
【发布时间】:2013-10-21 11:45:49
【问题描述】:

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

  • 字段名称
  • 价值

我试过这段代码:

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;     
}

【问题讨论】:

  • 我认为您可能缺少一些绑定标志,我不是反射大师,但我记得必须指定 BindingFlags.Instance 才能获取实例级别字段(反之亦然)
  • 它们是私有字段。你为什么要序列化/反序列化它们,为什么要获取它们的值?改为公开。
  • 更亲近的人不仅是找到私有的,而且是找到私有的 AND 值

标签: c# reflection


【解决方案1】:

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

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

上面的代码只适用于没有修改的实例字段

【讨论】:

  • 有效,但是......我在课堂上有一些 bool 和 DateTime 字段。我在第一篇文章中更新了课程。
【解决方案2】:

试试这个

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

【讨论】:

  • 如果只有private 字段,为什么还要包含BindingFlags.Public
  • 你很可能是对的。刚刚从我解决类似问题的代码中复制
猜你喜欢
  • 1970-01-01
  • 2012-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多