gpt4 book ai didi

c# - 是否可以使用 protected 构造函数创建对象的实例?

转载 作者:行者123 更新时间:2023-11-30 15:04:33 26 4
gpt4 key购买 nike

各位小伙伴大家好,问题是这样的:

public abstract class BaseClass
{
protected BaseClass()
{
// some logic here
}

protected BaseClass(Object parameter) : this()
{
// some more logic
}
}

public class Descendant : BaseClass
{
// no constructors
}

我试图在 Descendant 类上调用 Activator.CreateInstance,但没有找到构造函数

我是否需要在 Descentant 类上明确定义它?

我使用的绑定(bind)是:BindingFlags.Instance | BindingFlags.NonPublic

注意 1:我在现实中调用 AppDomain.CreateInstanceAndUnwrap(),如果它应该有一些影响的话。

 domain.CreateInstanceAndUnwrap(path, typeName, false, BindingFlags.Instance |
BindingFlags.NonPublic, null, new[] { parameter }, null, null);

注意 2:如果我在 Descendant 类中显式定义 protected 构造函数,那么它就可以工作,但我想尽可能避免这种情况。

最佳答案

不能使用Activator.CreateInstance,但在Full Trust环境下应该可以通过反射直接定位调用构造器。

实际上,您的后代类会自动提供一个公共(public)构造函数,该构造函数会传递到基类的 protected 构造函数。这应该工作得很好:

Activator.CreateInstance(typeof(Descendant))

<罢工>

好的,现在我意识到您正在尝试调用非默认构造函数。不幸的是,这是不允许的。直接调用基类的构造函数是行不通的,因为基类是抽象的。您需要在后代类上有一个构造函数(自动生成或显式定义)才能构造对象。

您可以在 Descendant 类上创建一个传递构造函数,但您的评论听起来像是您试图避免强制实现者在其构造函数中传递一个值。您可能真正想要的是一个可以在构造对象后调用的初始化方法:

// Define other methods and classes here
public abstract class BaseClass
{
protected BaseClass()
{
// some logic here
}

protected Object Parameter {get; private set;}

public virtual void Initialize(Object parameter)
{
Parameter = _parameter;
// some more logic
}
}

关于c# - 是否可以使用 protected 构造函数创建对象的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10097391/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com