是否可以在c#中公开一个私有变量

本文关键字:一个 变量 是否 | 更新日期: 2024-09-26 01:33:30

我只是想知道在c#中公开一个私有变量可能吗?我知道类的数据是否是私有的,这意味着不能从类外访问。如果,是的,那么怎么做呢?

是否可以在c#中公开一个私有变量

这是可能的。使用反射:

Type type = yourObj.GetType();
BindingFlags flags = BindingFlags.NonPublic | BindingFlags.Instance;
FieldInfo field = type.GetField("fieldName", flags);
object value = field.GetValue(yourObj);

反射允许在运行时读取类型的元数据,并揭示类型内部(字段、属性等)。

更多感谢@Sergey Berezovskiy。

在这个帮助下,我解决了这个问题。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
namespace ExposePrivateVariablesUsingReflection
{
    class Program
    {
        private class MyPrivateClass
        {
            private string MyPrivateFunc(string message)
            {
                return message + "Yes";
            }
        }
        static void Main(string[] args)
        {
            var mpc = new MyPrivateClass();
            Type type = mpc.GetType();
            var output = (string)type.InvokeMember("MyPrivateFunc",
                                        BindingFlags.Instance | BindingFlags.InvokeMethod |
                                        BindingFlags.NonPublic, null, mpc,
                                        new object[] {"Is Exposed private Member ? "});
            Console.WriteLine("Output : " + output);
            Console.ReadLine();
        }
    }
}

您可以使用反射来访问私有变量。然而,尽管有点跑题,我还是想分享一些关于InternalsVisibleTo的内容。

假设你在一个程序集中有你的域对象MyExample.DomainObjects,你不想把setter公开,但你需要你的服务层能够写入它们,但它在一个单独的程序集中,你仍然可以使用内部setter并避免反射:

namespace MyExample.DomainObjects {
    public class MyObject{
        public string MyProp { get; internal set; }
    }
}

如果在MyExample.DomainObjects项目的AssemblyInfo.cs 中放入以下内容,则可以将MyExample.ServiceLayer放在一个单独的程序集中

[assembly: InternalsVisibleTo("MyExample.ServiceLayer")]

然后,您可以从MyExample.ServiceLayer.调用MyExample.DomainObjects中的内部setter