C# 为什么可以';t Activator.CreateInstance<&燃气轮机;()是否查找内部无参数构造函数?
我正在尝试使用Activator.CreateInstance()创建对象的实例。用作模板的类只有一个构造函数,该构造函数没有参数,但是是内部的。这不应该是一个问题,因为在调用CreateInstance的范围内仍然可以访问该构造函数。但是,它抛出异常“没有为类型定义无参数构造函数…”。我做了一个新项目,将其与任何外部因素隔离开来,但这种情况仍然存在。以下是测试项目中的类C# 为什么可以';t Activator.CreateInstance<&燃气轮机;()是否查找内部无参数构造函数?,c#,.net,constructor,createinstance,C#,.net,Constructor,Createinstance,我正在尝试使用Activator.CreateInstance()创建对象的实例。用作模板的类只有一个构造函数,该构造函数没有参数,但是是内部的。这不应该是一个问题,因为在调用CreateInstance的范围内仍然可以访问该构造函数。但是,它抛出异常“没有为类型定义无参数构造函数…”。我做了一个新项目,将其与任何外部因素隔离开来,但这种情况仍然存在。以下是测试项目中的类 namespace Debug { class Program { static void
namespace Debug
{
class Program
{
static void Main(string[] args)
{
TestClass test = System.Activator.CreateInstance<TestClass>();
}
}
class TestClass
{
internal TestClass() { }
}
}
命名空间调试
{
班级计划
{
静态void Main(字符串[]参数)
{
TestClass test=System.Activator.CreateInstance();
}
}
类TestClass
{
内部TestClass(){}
}
}
如果我将构造函数公开,则不会发生错误,但为什么会这样,因为Main应该可以访问它?有什么可能的替代方案?我真的不能在真实的项目中公开构造函数
我尝试过的另一件事是将TestClass移动到Activator所在的系统命名空间,以防CreateInstance方法本身无法访问构造函数,但仍然引发异常。默认情况下,Activator.CreateInstance仅适用于公共构造函数 但是,有一个重载允许它查找非公共构造函数
公共静态对象?CreateInstance(类型,bool非公共)代码>
_您可能不理解或误解访问修饰符的工作原理
您声明了TestClass
拥有一个内部的构造函数internal
意味着只有同一命名空间中的类型才能访问该构造函数<代码>激活器
位于系统
命名空间中,该命名空间与您的类不同。因此,默认情况下,Activator
无法访问TestClass
的构造函数
试图将TestClass
放在系统
名称空间中是行不通的,因为这会产生潜在的安全风险——在这种情况下,运行时会忽略名称空间相同的事实。换句话说:您不能将类添加到任何BCL名称空间中
Activator
确实允许您通过其重载调用非公共构造函数,但我想问一下,您为什么觉得需要非公共构造函数。毕竟,没有什么能阻止其他代码使用相同的重载来调用非公共构造函数……internal
意味着只有同一程序集中的类型才能访问该成员。名称空间与访问修饰符完全正交。当然,您可以向系统
名称空间添加类型,但这可能会导致比解决问题更多的问题。