繁体   English   中英

为什么 Activator.CreateInstance<>() 找不到内部无参数构造函数?

[英]Why can't Activator.CreateInstance<>() find an internal parameterless constructor?

我正在尝试使用 Activator.CreateInstance<>() 创建对象的实例。 用作模板的类只有一个没有参数的内部构造函数。 这应该不是问题,因为在调用 CreateInstance 的范围内仍然可以访问该构造函数。 然而,它抛出异常“没有为类型定义无参数构造函数...'.'”。 我做了一个新项目来将它与任何外部因素隔离开来,但它仍然发生。 这是测试项目中的类

namespace Debug
{
    class Program
    {
        static void Main(string[] args)
        {
            TestClass test = System.Activator.CreateInstance<TestClass>();
        }
    }

    class TestClass
    { 
        internal TestClass() { }
    }
}

如果我公开构造函数,则不会发生错误,但为什么会这样,因为 Main 应该可以访问它? 有什么可能的替代方案? 我真的不能只是在实际项目中公开构造函数。

我尝试的另一件事是将 TestClass 移动到 Activator 所在的 System 命名空间,以防万一是 CreateInstance 方法本身无法访问构造函数,但仍会抛出异常。

默认情况下 Activator.CreateInstance 仅适用于公共构造函数

然而,有一个重载允许它寻找非公共构造函数

public static object? CreateInstance (Type type, bool nonPublic);

https://docs.microsoft.com/en-us/dotnet/api/system.activator.createinstance?view=netcore-3.1#System_Activator_CreateInstance_System_Type_System_Boolean _

您要么不理解,要么对访问修饰符的工作方式有误解。

您将TestClass声明为具有一个internal构造函数。 internal意味着只有相同命名空间中的类型才能访问该构造函数。 Activator位于System命名空间中,该命名空间与您的类不同。 因此,默认情况下Activator无法访问TestClass的构造函数。

尝试将TestClass放在System命名空间中是行不通的,因为这会产生潜在的安全风险 - 在这种情况下,运行时会忽略命名空间相同的事实。 换句话说:您不能将类添加到任何 BCL 命名空间中。

Activator是否允许您通过其object? CreateInstance(Type type, bool nonPublic)调用非公共构造object? CreateInstance(Type type, bool nonPublic) object? CreateInstance(Type type, bool nonPublic)重载,但我会质疑为什么您觉得无论如何都需要非公共构造函数。 毕竟,没有什么可以阻止其他代码使用相同的重载来调用您的非公共构造函数......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM