2013-12-14 160 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中的外部設置器。

相關問題