这是我写一个小第三方库的问题。在这个图书馆里我有一个像这样的课程
public class TestClass
{
public int TestField { get; private set; }
public TestClass( )
{
TestField = 1;
}
}
然后我有一个像这样的类的变种形式
public TestClass test = new TestClass( );
我面临的问题是像这样的反射
PropertyInfo field = typeof( TestClass ).GetProperty( "TestField" );
field.SetValue( test, 2, null );
程序员可以改变这个类的内部价值。这将是非常糟糕的事情因为它可以崩溃孔库。我的问题是保护我的代码形式这种变化的最佳方法是什么。我知道我可以使用某种bool标志,因此只能更改一个值,但这不是很好的salution有更好的吗?
最诚挚的问候,
约尔丹
答案 0 :(得分:6)
请理解我的意思是尊重所有人:
你在浪费时间。严重。
在指定API或合同时不考虑反思。
相信这一点。不可能停止反射。如果消费者倾向于偷看你的代码并翻转因某种原因而被隐藏的内容,那么后果就在于他们,而不是你。
答案 1 :(得分:6)
您正试图保护您的系统免受更强的攻击。如果您不信任某些代码,请使用部分信任运行它 - 然后当它要求反映您的类型时,它将被拒绝。
反思(以及DynamicMethod
等相关技术)可以以足够的信任获得对数据的几乎无限制的访问权限(例如,更改字符 string
没有重新分配它;因此,您必须减少对不受信任的代码的信任。
以类似的方式,对您的进程(或其加载的dll)具有调试者或管理员访问权限的任何人都可以破坏您的代码。这不是一个有趣的攻击,因为“黑客”必须已经至少至少访问代码(可能更多)。
答案 2 :(得分:2)
您甚至可以使用反射change private readonly
字段。因此,您最好的选择可能是const
。
答案 3 :(得分:0)
如果您想要一个常量值,请使用ReadOnly
值。或者只使用const
。
如果您希望客户(程序员)选择其中一个“安全值”,请使用Enum
。
编辑:显然,enum
不够安全。您可以使用以下格式的readonly
字段:
public class SafeValue
{
private string _value;
public static readonly SafeValue Value1 = new SafeValue("value1");
public static readonly SafeValue Value2 = new SafeValue("value2");
private SafeValue(string value)
{
_value = value;
}
public override string ToString()
{
return _value;
}
}