为什么 Activator.CreateInstance<>() 找不到内部无参数构造函数?
Why can't Activator.CreateInstance<>() find an internal parameterless constructor?
我正在尝试使用 Activator.CreateInstance<>() 创建一个对象的实例。用作模板的 class 只有一个构造函数,它没有参数但是是内部的。这应该不是问题,因为在调用 CreateInstance 的范围内仍然可以访问该构造函数。然而,它抛出异常“没有为类型定义的无参数构造函数......'。'”。我做了一个新项目来将它与任何外部因素隔离开来,但它仍然发生。这是测试项目
中的classes
namespace Debug
{
class Program
{
static void Main(string[] args)
{
TestClass test = System.Activator.CreateInstance<TestClass>();
}
}
class TestClass
{
internal TestClass() { }
}
}
如果我创建构造函数 public,则不会发生错误,但为什么会这样,因为 Main 应该可以访问它?还有什么可能的选择?真的不能只在实际项目中做构造函数public
我尝试的另一件事是将 TestClass 移动到 Activator 所在的 System 命名空间,以防 CreateInstance 方法本身无法访问构造函数但仍会抛出异常。
默认情况下 Activator.CreateInstance 仅适用于 public 构造函数
但是有一个重载允许它寻找 non-public 构造函数
public static object? CreateInstance (Type type, bool nonPublic);
您不了解或误解了访问修饰符的工作原理。
您声明 TestClass
有一个构造函数,即 internal
。 internal
意味着只有同一命名空间中的类型才能访问该构造函数。 Activator
位于 System
命名空间中,该命名空间与您的 class 不同。因此 Activator
默认情况下不能访问 TestClass
的构造函数。
尝试将 TestClass
放入 System
命名空间是行不通的,因为这会产生潜在的安全风险 - 在这种情况下,运行时会忽略命名空间相同的事实。换句话说:您不能将 classes 添加到任何 BCL 名称空间中。
Activator
确实允许您通过其 object? CreateInstance(Type type, bool nonPublic)
重载调用 non-public 构造函数,但我想问为什么您仍然觉得需要一个 non-public 构造函数.毕竟,没有什么可以阻止其他代码使用相同的重载来调用您的 non-public 构造函数...
我正在尝试使用 Activator.CreateInstance<>() 创建一个对象的实例。用作模板的 class 只有一个构造函数,它没有参数但是是内部的。这应该不是问题,因为在调用 CreateInstance 的范围内仍然可以访问该构造函数。然而,它抛出异常“没有为类型定义的无参数构造函数......'。'”。我做了一个新项目来将它与任何外部因素隔离开来,但它仍然发生。这是测试项目
中的classesnamespace Debug
{
class Program
{
static void Main(string[] args)
{
TestClass test = System.Activator.CreateInstance<TestClass>();
}
}
class TestClass
{
internal TestClass() { }
}
}
如果我创建构造函数 public,则不会发生错误,但为什么会这样,因为 Main 应该可以访问它?还有什么可能的选择?真的不能只在实际项目中做构造函数public
我尝试的另一件事是将 TestClass 移动到 Activator 所在的 System 命名空间,以防 CreateInstance 方法本身无法访问构造函数但仍会抛出异常。
默认情况下 Activator.CreateInstance 仅适用于 public 构造函数
但是有一个重载允许它寻找 non-public 构造函数
public static object? CreateInstance (Type type, bool nonPublic);
您不了解或误解了访问修饰符的工作原理。
您声明 TestClass
有一个构造函数,即 internal
。 internal
意味着只有同一命名空间中的类型才能访问该构造函数。 Activator
位于 System
命名空间中,该命名空间与您的 class 不同。因此 Activator
默认情况下不能访问 TestClass
的构造函数。
尝试将 TestClass
放入 System
命名空间是行不通的,因为这会产生潜在的安全风险 - 在这种情况下,运行时会忽略命名空间相同的事实。换句话说:您不能将 classes 添加到任何 BCL 名称空间中。
Activator
确实允许您通过其 object? CreateInstance(Type type, bool nonPublic)
重载调用 non-public 构造函数,但我想问为什么您仍然觉得需要一个 non-public 构造函数.毕竟,没有什么可以阻止其他代码使用相同的重载来调用您的 non-public 构造函数...