我正在尝试使用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所在的系统名称空间,以防CreateInstance方法本身无法访问构造函数,但异常仍然会被抛出。
发布于 2020-08-25 20:27:53
默认情况下,Activator.CreateInstance只适用于公共构造函数。
但是,有一个过载,允许它寻找非公共构造函数。
public static object? CreateInstance (Type type, bool nonPublic);
发布于 2020-08-25 20:40:14
您要么不理解访问修饰符,要么误解了访问修饰符的工作原理。
您将TestClass
声明为有一个构造函数,即internal
。internal
意味着只有同一名称空间中的类型才能访问该构造函数。Activator
位于System
名称空间中,与类的名称空间不同。因此,默认情况下,Activator
不能访问TestClass
的构造函数。
尝试将TestClass
放在System
命名空间中是行不通的,因为这会造成潜在的安全风险--在这种情况下,运行时忽略了名称空间相同的事实。换句话说:您不能将类添加到任何BCL命名空间中。
Activator
确实允许您通过其object? CreateInstance(Type type, bool nonPublic)
重载调用非公共构造函数,但我想问您为什么觉得需要有一个非公共构造函数。毕竟,没有什么能阻止其他代码使用相同的重载来调用非公共构造函数.
https://stackoverflow.com/questions/63586424
复制相似问题