【问题标题】:Is it Possible to expose a private variable in c# ?是否可以在 c# 中公开私有变量?
【发布时间】:2014-01-02 13:42:34
【问题描述】:

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

【问题讨论】:

  • 修改类还是不修改类?如果您可以修改类,则可以通过属性或方法公开变量。

标签: c# properties access-specifier


【解决方案1】:

这是可能的。为此使用Reflection

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

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

【讨论】:

  • 嗨,你能帮我做一个小样本吗?
  • @kumarch1 当然,用获取私有实例字段值的示例更新了答案
  • 非常感谢。那么我们可以说我的数据在多大程度上是安全的。这里是显示它被暴露了。请告诉我如何将其设为私有 - 我的意思是完全私有 - 以便其他人无法访问。有可能吗?
  • @kumarch1 私有并不意味着“安全”,它只是意味着“不暴露给其他类”。您可以通过在源头保护数据来确保数据安全,而不仅仅是在私有字段中使用它。
  • @kumarch1 不,你不能让你的数据“完全私有”——总是可以通过反射来获取它们。但是您可以使这些信息很难与 obfuscation 一起使用。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    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 中的内部设置器。

    【讨论】:

      猜你喜欢
      • 2016-08-29
      • 2017-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-30
      • 2018-11-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多