首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么Activator.CreateInstance<>()找不到内部的无参数构造函数?

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

Stack Overflow用户
提问于 2020-08-25 20:12:53
回答 2查看 752关注 0票数 0

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

代码语言:javascript
运行
复制
namespace Debug
{
    class Program
    {
        static void Main(string[] args)
        {
            TestClass test = System.Activator.CreateInstance<TestClass>();
        }
    }

    class TestClass
    { 
        internal TestClass() { }
    }
}

如果我将构造函数公之于众,错误就不会发生,但是为什么Main应该有访问它的权限呢?还有什么可供选择的呢?我真的不能让构造函数在真正的项目中公开。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-25 20:27:53

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

但是,有一个过载,允许它寻找非公共构造函数。

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

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

票数 4
EN

Stack Overflow用户

发布于 2020-08-25 20:40:14

您要么不理解访问修饰符,要么误解了访问修饰符的工作原理。

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

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

Activator确实允许您通过其object? CreateInstance(Type type, bool nonPublic)重载调用非公共构造函数,但我想问您为什么觉得需要有一个非公共构造函数。毕竟,没有什么能阻止其他代码使用相同的重载来调用非公共构造函数.

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63586424

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档