【问题标题】:C# Parameterless Constructor on inherited class继承类上的 C# 无参数构造函数
【发布时间】:2015-07-31 15:32:02
【问题描述】:

希望是一个简单的问题

我需要序列化一个继承类,在此示例中 iProperty 继承自“PropertyDescriptor”。为了实现这个 iProperty 需要一个无参数构造函数,而基类没有这样的构造函数,如果我尝试添加一个构造函数,我被告知基类不包含一个需要 0 个参数的方法,这是正确的。 我如何解决这个问题。

谢谢。

例子

   public class iProperty : PropertyDescriptor
    {
        private string propName;
        private object propValue;

        // Need Parameterless Construtor ?

        public iProperty(string pName, object pValue)
            : base(pName, new Attribute[] { })
        {
            propName = pName;
            propValue = pValue;

        }
    }

【问题讨论】:

  • 我认为我们需要查看PropertyDescriptor 类(或至少是它的构造函数)。
  • 您可能需要为iProperty 制作一个可序列化的包装器,使用方法GetiProperty 或基于序列化信息创建iProperty 对象的等效方法。没有解决构造函数的要求。
  • 请显示您的 iProperty 无参数构造函数。这可以调用具有默认值的现有 PropertyDescriptor 构造函数之一。
  • 那么,如果我要让 iProperty 成为一个外部类,以便它可以被序列化,我将如何将该类集成到上述代码中?谢谢
  • 您可以使用组合而不是继承,并使用属性“[XmlIgnore]”标记 PropertyDescriptor 字段。或者将 PropertyDescriptor 更改为接口。或者为 PropertyDescriptor 创建一个无参数的构造函数。这实际上取决于您的架构和限制。

标签: c# inheritance constructor


【解决方案1】:
public class iProperty : PropertyDescriptor
{
    private string propName;
    private object propValue;

    // Need Parameterless Construtor ?
    public iProperty()
        : base("placeholder", new Attribute[] { })
    {
    }

    public iProperty(string pName, object pValue)
        : base(pName, new Attribute[] { })
    {
        propName = pName;
        propValue = pValue;

    }
}

【讨论】:

  • 谢谢,已经试过了,它报告'有一个错误反映类型'
【解决方案2】:

你可以创建一个无参数的构造器,但是你必须调用一个基类构造器

public class iProperty : PropertyDescriptor
{

    public iProperty()
        : base(someDefaults)
    {
    }
}

您还可以在基类中实现无参数构造函数并使其受到保护。这样除了派生类之外没有人可以调用它。

【讨论】:

  • 不起作用,因为它会导致序列化异常 - '错误反映类型'
  • 如何将构造函数添加到作为 dotnet 一部分的基类?
  • 我认为 PropertyDescription 是你的课程。如果是 dotnets,则不能添加构造函数。
猜你喜欢
  • 2013-12-24
  • 1970-01-01
  • 1970-01-01
  • 2013-01-24
  • 1970-01-01
  • 2011-12-08
  • 1970-01-01
  • 1970-01-01
  • 2019-12-14
相关资源
最近更新 更多