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

时间:2013-12-14 23:16:01

标签: c# properties access-specifier

我只是想知道在c#中公开私有变量是否可能?我知道如果一个类的数据是私有的,则无法从外部类访问。如果,是的,那怎么样?

3 个答案:

答案 0 :(得分:4)

有可能。请使用Reflection

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

Reflection允许在运行时读取类型的元数据并发现类型内部(字段,属性等)。

答案 1 :(得分:1)

非常感谢@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();
        }
    }
}

答案 2 :(得分:0)

您可以使用反射来访问私有变量。然而,即使有点偏离主题,我想分享一些关于InternalsVisibleTo的内容。

假设您在程序集MyExample.DomainObjects中拥有域对象,并且您不希望将setter设置为public,但是您需要服务层能够写入它们但是它位于单独的程序集中,您可以仍然使用内部设置器并避免反射:

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。