我只是想知道是否有可能在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中声明一个变量而有条件?
是否修改类?如果你可以修改类,你可以通过属性或方法暴露变量。 –