2013-10-21 59 views
0

與下面的類,我試圖讓:在C#反射獲取從對象的字段和值

  • 字段名

我想這一段代碼:

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

我想你可能會丟失一些綁定標誌,我不是反射大師,但我記得不得不指定'BindingFlags.Instance'來獲取實例級別fie lds,(反之亦然靜態) – Charleh

+0

他們是私人領域。你爲什麼試圖序列化/反序列化它們,你爲什麼試圖獲得它們的值?反而讓他們公開。 –

+0

更緊密的人不僅可以找到私人的,但找到私人和價值 –

回答

0

是的,我認爲這將工作:

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 

上面的代碼將只爲實例字段不經修改

+0

工作,但...我有一些bool和DateTime字段在類中。我在第一篇文章中更新了課程。 –

0

試試這個

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

如果只有'私人'領域,你爲什麼要包含'BindingFlags.Public'? – James

+0

你是最可能的權利。只是從我的代碼中複製我解決了類似問題 –