我正在尝试创建一个扩展类 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 中的任何代码。
答案 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