C#中禁止传参时,如何获取调用父类构造函数的子类信息?
解决方案:无需传参让父类构造函数识别调用的子类
当然可以实现你的需求!先帮你修正代码里的一个小笔误——Child2的构造函数不小心写成了Child1,先把这个问题理顺,再来看核心实现。
问题核心分析
你想要父类的无参构造函数自动识别出是哪个子类在调用它,并且不需要子类给父类构造函数传递任何参数。这其实可以通过C#的运行时类型信息来实现,完全不用额外传参。
修正后的完整实现代码
using System; class Parent { public Parent() { // 利用GetType()获取当前实例的实际运行时类型名称 Console.WriteLine($"{GetType().Name} called me"); } } class Child1 : Parent { private string name; public Child1(string name) { this.name = name; } } class Child2 : Parent { private string surname; public Child2(string surname) { this.surname = surname; } } // 测试代码 class Program { static void Main() { var child1 = new Child1("Alice"); // 输出:Child1 called me var child2 = new Child2("Smith"); // 输出:Child2 called me } }
原理说明
- 当你实例化子类时,C#会先调用父类的构造函数,但此时对象的实际运行时类型已经是子类了(虽然父类构造函数还在执行,但对象的类型元数据已经确定)。
GetType()方法返回的是当前对象的实际类型(也就是子类类型),而不是父类类型,所以通过GetType().Name就能直接拿到调用父类构造函数的子类名称,完全不需要子类传递任何参数。
额外注意事项
- 如果存在多层继承(比如
GrandChild : Child1),GetType().Name会返回最底层的子类名称(也就是GrandChild),如果你需要获取直接调用父类的子类(比如Child1),可以改用GetType().BaseType.Name,但这取决于你的具体需求。 - 确保父类的构造函数是可访问的(比如示例里改成
public,否则子类无法调用),当然如果是内部类可以用internal,根据你的访问修饰符需求调整即可。
内容的提问来源于stack exchange,提问作者Vojin
相关产品推荐
相关产品推荐

