如何使得某个类无法被反射技术而访问到私有成员
class Set
{
private int _test = 10;
public Set()
{
}
public int Test
{
get
{
return _test;
}
}
}
class App
{
static void Main()
{
Set myTest = new Set();
Console.WriteLine("{0}",myTest.Test);
Type t = typeof(Set);
try
{
t.InvokeMember("_test", BindingFlags.SetField | BindingFlags.Non
Public | BindingFlags.Instance, null, myTest, new object[] { 5 });
Console.WriteLine("{0}", myTest.Test);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
Console.Read();
}
}
执行之后set类的私有变量被改成5了。
请问设计set类时如何阻止反射的这一操作呢?
------解决方案--------------------
看看你要的是不是这个
http://msdn2.microsoft.com/zh-cn/library/hk3b9142.aspx
------解决方案--------------------
如果你用 .Net 1.x 的话:
System.Security.Permissions.StrongNameIdentityPermission 可以从根本上防止调用, 即使反射调用也会检查..
(可惜 2.x 草率取消 StrongNameIdentityPermission 强大功能)
1. 利用 SN.EXE 生成一个 StrongName key 文件
2. 把自己的 Application 引用上述 key file Strong Name
3. 相应位置使用:[StrongNameIdentityPermission(SecurityAction.Demand, PublicKey="public key from your key file")]
如果是 2.x 用以尝试 ReflectPemissionFlag 或者 InternalVisibleToAttribute ...