2013-12-14 128 views
0

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

+0

是否修改类?如果你可以修改类,你可以通过属性或方法暴露变量。 –

回答

4

这是可能的。使用Reflection为:

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

反射允许在运行时读取类型的元数据,并揭开类型的内部(领域,propertis等)。

+0

你好,请你帮我一个小样本? –

+0

@ kumarch1当然,更新的答案与获取私有实例字段值的示例 –

+0

非常感谢。那么我们可以说我的数据是安全的。这里显示它是暴露的。请告诉我如何使这个私人 - 我的意思是完全私人 - 这样没有其他人可以访问。可能吗? –

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(); 
     } 
    } 
} 
0

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

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

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

你可以有你的MyExample.ServiceLayer在单独的程序,如果你把MyExample.DomainObjects项目的AssemblyInfo.cs以下

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

然后你可以打电话进来来自MyExample.ServiceLayer的MyExample.DomainObjects中的外部设置器。

相关问题