首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >访问私有字段

访问私有字段
EN

Stack Overflow用户
提问于 2012-06-02 21:42:02
回答 3查看 27K关注 0票数 19

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

我要去找System.Guid.c。有没有办法访问它,或者我应该只复制strut中的代码,并将字段公开?

EN

回答 3

Stack Overflow用户

发布于 2012-06-02 21:48:37

你应该试试System.Reflection。下面是一个例子:

代码语言:javascript
复制
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
        }
    }
}
票数 6
EN

Stack Overflow用户

发布于 2017-09-29 20:24:53

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

代码语言:javascript
复制
public static T GetFieldValue<T>(this object obj, string name) {
    var field = obj.GetType().GetField(name, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
    return (T)field?.GetValue(obj);
}

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

代码语言:javascript
复制
Guid id = Guid.NewGuid();
Int16 c = id.GetFieldValue<Int16>("_c");
票数 4
EN

Stack Overflow用户

发布于 2012-06-02 21:55:35

虽然使用反射可以做到这一点,但简单地从System.Guid.ToByteArray()检索c可能会更容易。

代码语言:javascript
复制
byte[] guid = guid.ToByteArray();
short c = (short)((guid[7] << 8) | guid[6]);

由于此方法使用公共的和有文档记录的方法,因此它较少受版本之间的更改的影响。(通常,应该避免依赖私有实现细节,因为这些细节可能会因版本而异。)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10862747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档