使用参数将没有参数的构造函数重定向到基类ctor

时间:2011-10-31 23:25:11

标签: c# constructor

我正在尝试创建一个扩展类 Foo 的类 Bar Foo 的代码超出了我的控制范围。

当有人创建 Bar 的新实例时(通过编写类似 Bar x = new Bar(); 的内容)我希望这会触发对的调用> Foo 构造函数,它接受一个输入参数。

基本上:

class Foo {
    public Foo(string message) { print("The new Foo says: " + message); }
}

class Bar : Foo {
    public Bar() : base(this.GetType()) { }
}

所以当有人使用 new Bar()时,它应该打印出来新的Foo说:Bar 。 (假设有一个 print 函数,这不是重点。)

相反,C#抱怨因为我正在尝试计算基础构造函数的参数中的结果。

请记住, Foo 超出了我的范围,所以我无法更改 Foo 中的任何代码。

2 个答案:

答案 0 :(得分:3)

您不能在类的实际构造函数之前使用this,因为只有参数和静态成员(因为static构造函数在任何非静态构造函数之前运行)才可访问上下文。在您能够访问this之前,运行时首先需要构造您继承的任何类。

作为解决方法,您可以使用typeof运算符:

class Bar : Foo {
    public Bar() : base(typeof(Bar).ToString()) { }
}

当然,这不是便携式的,但可能是你能想到的最好的东西。

答案 1 :(得分:1)

this.GetType()无法用作初始化例程。

您无法执行传递给基类但依赖于当前实例的代码。这是合乎逻辑的,因为基类构造函数首先执行

但是,如果您传递的是某种类型,则可以使用typeof代替GetType()

以下代码运行并正确编译:

namespace TestNamespace
{
    using System;

    public class Test
    {
        public static void Main()
        {
            var foo = new Bar();
            Console.ReadKey();
        }
    }

    class Foo
    {
        public Foo(Type type) { Console.WriteLine("The type of Foo is: " + type.ToString()); }
    }

    class Bar : Foo
    {
        public Bar() : base(typeof(Bar)) { }
    }
}

执行时,会打印到控制台:

  

Foo的类型是:TestNamespace.Bar