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

如何在C#多层继承结构中正确获取目标派生类B的Type?

解决TargetType固定为父类B类型的问题

看起来你已经找到了一个可行的解决方案,我帮你把逻辑理得更清晰,同时补充适配场景的细节,再提供一些可选的优化思路。

首先明确核心需求:不管实例化的是B还是它的子类C,TargetType属性都要指向typeof(B),而非实例的实际运行时类型。你当前在B的构造函数中显式赋值的方式完全没问题,而且是可读性最强的方案之一。

原始问题代码回顾

先梳理你遇到问题的代码结构:

public abstract class MyBase { public Type TargetType { get; protected set; } }
public class A : MyBase { 
    public A() { 
        TargetType = GetType(); // 实例化C时,这里会返回typeof(C),不符合预期
    } 
}
public class B : A { public B() { } }
public class C : B { public C() { } }

你的可行解决方案

你通过在B的构造函数中显式覆盖TargetType的方式,完美解决了问题:

public class B : A { 
    public B() { 
        TargetType = typeof(B); // 强制将TargetType设置为B的类型,C继承后会自动沿用这个值
    } 
}

这个方案的最大优势是意图明确,任何维护代码的人一眼就能看懂:B类及其所有子类的TargetType都固定为B的类型,没有歧义。

适配Class1.cs静态字典场景

结合你提到的Class1.cs中的静态字典场景(比如用于类型与处理逻辑的映射),这个方案能很好地适配需求。例如:

// Class1.cs
public static class Class1 {
    // 假设字典存储Type到对应业务处理逻辑的映射
    public static Dictionary<Type, Action> TypeHandlers = new Dictionary<Type, Action> {
        { typeof(B), () => Console.WriteLine("执行B类型专属的业务逻辑") }
    };
}

此时,不管你创建的是new B()还是new C(),TargetType都是typeof(B),都能正确匹配到字典中的处理逻辑,完全符合场景需求。

可选优化方案(针对扩展场景)

如果你后续有多个类似B的中间类,或者想避免子类忘记设置TargetType的问题,可以考虑通过基类构造函数参数的方式,强制子类指定目标类型:

public abstract class MyBase { 
    public Type TargetType { get; protected set; }

    // 基类仅提供带目标类型参数的构造函数,约束子类必须指定
    protected MyBase(Type targetType) {
        TargetType = targetType;
    }
}

public class A : MyBase { 
    // 让子类必须传递目标类型
    protected A(Type targetType) : base(targetType) { }
}

public class B : A { 
    // 明确指定当前类为目标类型
    public B() : base(typeof(B)) { }
}

public class C : B { 
    // 无需额外修改,直接继承B的构造逻辑即可
    public C() : base(typeof(B)) { }
}

这种方式更规范,但对于你的当前场景来说,原来的显式赋值方案已经足够简洁直观。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:55:25