如何在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
相关产品推荐
相关产品推荐

