You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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就能直接拿到调用父类构造函数的子类名称,完全不需要子类传递任何参数。

额外注意事项

  1. 如果存在多层继承(比如GrandChild : Child1),GetType().Name会返回最底层的子类名称(也就是GrandChild),如果你需要获取直接调用父类的子类(比如Child1),可以改用GetType().BaseType.Name,但这取决于你的具体需求。
  2. 确保父类的构造函数是可访问的(比如示例里改成public,否则子类无法调用),当然如果是内部类可以用internal,根据你的访问修饰符需求调整即可。

内容的提问来源于stack exchange,提问作者Vojin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 08:32:42