访问私有字段

是否可以获取或设置私有字段?

我想获得System.Guid.c 。 有没有办法访问它或者我应该从strut复制代码并将字段公开?

您可以使用Quantic Programming建议的reflection

 var guid = Guid.NewGuid(); var field= typeof (Guid).GetField("_c", BindingFlags.NonPublic |BindingFlags.GetField | BindingFlags.Instance); var value = field.GetValue(guid); 

虽然如果你可以首先将guid转换为字节数组,我可能会建议:

 var guid = Guid.NewGuid(); var c = BitConverter.ToInt16(guid.ToByteArray(), 6); 

后一种方法避免使用reflection。

编辑

你提到需要能够设置值,你仍然可以避免reflection:

 var guid = Guid.NewGuid(); var guidBytes = guid.ToByteArray(); // get value var c = BitConverter.ToInt16(guidBytes, 6); // set value Buffer.BlockCopy(BitConverter.GetBytes(c), 0, guidBytes, 6, sizeof(Int16)); var modifiedGuid = new Guid(guidBytes); 

你应该尝试System.Reflection 。 这是一个例子:

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; namespace AccessPrivateField { class foo { public foo(string str) { this.str = str; } private string str; public string Get() { return this.str; } } class Program { static void Main(string[] args) { foo bar = new foo("hello"); Console.WriteLine(bar.Get()); typeof(foo).GetField("str", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(bar, "changed"); Console.WriteLine(bar.Get()); //output: //hello //changed } } } 

虽然可以使用reflection执行此操作,但从System.Guid.ToByteArray()简单地检索c可能更容易。

 byte[] guid = guid.ToByteArray(); short c = (short)((guid[7] << 8) | guid[6]); 

由于此方法使用公共和记录的方法,因此不太可能在版本之间进行更改。 (一般情况下,应避免依赖私有实现细节,因为这些细节可能会因版本而异。)

您可以使用扩展方法获取任何类型的任何私有字段:

 public static T GetFieldValue(this object obj, string name) { var field = obj.GetType().GetField(name, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); return (T)field?.GetValue(obj); } 

然后访问任意类型的私有字段:

 Guid id = Guid.NewGuid(); Int16 c = id.GetFieldValue("_c");