代码之家  ›  专栏  ›  技术社区  ›  IordanTanev

使用反射保护值不受更改影响?

  •  4
  • IordanTanev  · 技术社区  · 15 年前

    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 );
    


    顺致敬意,

    4 回复  |  直到 14 年前
        1
  •  6
  •   Sky Sanders    15 年前

    请理解我的意思:

    你在浪费时间。说真的。

    相信这个。不可能停止反射。如果一个消费者执意偷看你的代码,翻看那些被隐藏的代码,那么,后果就在他们身上,而不是你。

        2
  •  6
  •   Marc Gravell    15 年前

    你在试图保护你的系统免受 而不是你的代码。如果您不信任某些代码,请使用部分信任运行它—然后当它要求反映您的类型时,它将被拒绝。

    反射(和相关技术,如 DynamicMethod )可以 有足够的信任 人物 string 从未重新分配);因此,必须减少对不可信代码的信任。

    以类似的方式,任何对您的进程(或它加载的DLL)具有调试器或管理员访问权限的人都可以破坏您的代码。这不是一个有趣的攻击,因为“黑客”必须 至少 与代码一样多的访问权限(可能更多)。

        3
  •  2
  •   Community CDub    8 年前

    你甚至可以 change 这个 private readonly 使用反射的场。所以,你最好的选择可能是 const

        4
  •  0
  •   Fitzchak Yitzchaki    15 年前

    使用 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;
        }
    }