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

使用Actvator.CreateInstance实例创建具有私有构造函数的类的对象?

c#
  •  2
  • TalentTuner  · 技术社区  · 14 年前

    通过使用 Activator.CreateInstance

    有什么办法可以防止这种情况发生吗?

    4 回复  |  直到 14 年前
        1
  •  4
  •   Dan Tao    14 年前

    反射通常会破坏封装。 私人会员 任何 可以使用反射访问类型(构造函数、方法、属性、字段,您可以为其命名)( Activator.CreateInstance 落在这把伞下)。

    也就是说,如果您不希望您的类型通过 the overload of Activator.CreateInstance generally used to overcome private constructors ,您可以完全摆脱类型的无参数构造函数(只定义接受参数的构造函数)。

        2
  •  3
  •   Tim Robinson    14 年前

    简而言之:你不能

    更详细的答案是:阅读 .NET code access security

        3
  •  1
  •   Erich Mirabal    14 年前

    有一种方法可以阻止它的发生,但它并不漂亮: StackTrace 班级。创建新的 堆栈跟踪 GetFrames() 并对其进行迭代,检查是否有任何帧包含来自 Activator 类型。在 StackFrame GetMethod 功能。返回一个 MethodBase 继承自 MemberInfo DeclaringType 你关心的财产。

    在遍历堆栈帧时,如果注意到调用类型之一是 活化剂

    您应该只需要查看两个stackframe(跳过当前的一个)就可以验证这一点。我相信除了这条路,还有另外一条路 活化剂 类使用反射进行实例化,但我现在不记得了。

        4
  •  0
  •   TheBoyan    13 年前

    我知道这是一个旧的职位,但我碰到它,我只是无法抗拒。

    有一种方法可以防止 Activator 访问私有构造函数。例如,在使用嵌套类的Singleton pattern类中:

    public sealed class SingletonClass
    {
    
    
     SingletonClass()
        {
        }
    
    public static SingletonClass Instance
    {
        get
        {
            return InnerClass.instance;
        }
    }
    
    class InnerClass
    {
        static InnerClass()
        {
        }
    
        internal static readonly SingletonClass instance = new SingletonClass();
    }
    

    }