我只是想知道是否有可能在c#中暴露一個私有變量?我知道一個班級的數據是否是私人的,意味着不能從外部班級訪問。如果,是的,那麼如何?是否有可能在c#中暴露一個私有變量?
回答
這是可能的。使用Reflection爲:
Type type = yourObj.GetType();
BindingFlags flags = BindingFlags.NonPublic | BindingFlags.Instance;
FieldInfo field = type.GetField("fieldName", flags);
object value = field.GetValue(yourObj);
反射允許在運行時讀取類型的元數據,並揭開類型的內部(領域,propertis等)。
你好,請你幫我一個小樣本? –
@ kumarch1當然,更新的答案與獲取私有實例字段值的示例 –
非常感謝。那麼我們可以說我的數據是安全的。這裏顯示它是暴露的。請告訴我如何使這個私人 - 我的意思是完全私人 - 這樣沒有其他人可以訪問。可能嗎? –
更多謝謝@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公開,但是你需要你的服務層能夠寫入它們,但它是在一個單獨的程序集中,你仍然可以使用內部制定者,並避免反射:
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中的外部設置器。
- 1. 是否可以綁定到私有變量暴露的屬性?
- 2. 使用auto暴露一個私有類型:它可能有用嗎?
- 3. 是否有可能在c#中釋放一個變量?
- 4. 是否可以在Rust中創建一個私有變量?
- 5. 是否有可能在本地wifi上暴露boot2docker ip
- 6. 是否有可能在不同的端口暴露WCF服務?
- 7. 從私有成員中暴露q_property
- 8. 是否有可能從C++中暴露具有不同值的「相同」常量到多個Lua協程?
- 9. 是否有可能在C++中有一個遞歸向量?
- 10. 在Objective C中,是否有可能將變量「連接」到另一個變量?
- 11. 是否有可能將USB設備暴露給lxc/docker容器?
- 12. 暴露成員或使它們在Python中是私有的?
- 13. 使用模板暴露私有的typedef,
- 14. 是否有可能在C++中改變一個變量的ADRESS與指針
- 15. 在一個類中使用私有靜態變量是否好?
- 16. 是否有可能在Java中聲明一個1位變量?
- 17. 是否有可能讓一個swagger參數名稱有變量?
- 18. 是否有可能從C#中的本地C++類創建一個變量?
- 19. 是否有可能有私人課程?
- 20. 是否有可能在另一個變量中使用未聲明的變量
- 21. 向量的私有繼承,暴露相等運算符
- 22. 是否有可能挽救一個變量在控制器
- 23. 是否有可能在JavaScript內部傳遞一個php變量?
- 24. 是否有可能立刻露出DataGridComboBoxColumn?
- 25. 是否有可能在變量中更改變量的值?
- 26. 是否有可能在C++中有一個靜態字段?
- 27. 是否有可能在C++中有可變數量的字符串數組?
- 28. 是否有可能在處理程序中有一個靜態變量?
- 29. 是否有可能在shell腳本的「env」行中有一個環境變量?
- 30. 是否有可能在Java中聲明一個變量而有條件?
是否修改類?如果你可以修改類,你可以通過屬性或方法暴露變量。 –