如何以更动态的方式设置 C# 向下转换

How to setup C# downcasting in a more dynamic way

如果标题不太正确,请见谅。
我有一组基础 classes 我是从中派生的。有一个主要的和一堆我可以添加到它上面的组件。

    public class Entity {
        public EntityPart ep;
    }
    public class EntityPart {
        public void eFunc() {}
    }

我派生的 classes 显然非常适合我所有的虚函数。但这是我 运行 进入

的问题
    public class dEntity : Entity {
        public void someFunc() {
            ep.derivedFunc(); // Error, does not exist on EntityPart
        }
    }
    public class dEntityPart : EntityPart {
        public void derivedFunc() {}
    }

我很快就明白发生了什么事。由于 ep 仍然只是一个 EntityPart,它没有派生功能。

我找到了一个有效的解决方案,但感觉有些地方不对劲。当我问其他人时,他们似乎对我的代码以前不起作用感到困惑。

    public class dEntity : Entity {
        public new dEntityPart ep {
            get { return (dEntityPart)base.ep; }
        }
    }

据我了解,这只是将名为 ep 的变量声明为 dEntityPart 类型。这是一个 属性 并具有将 base.ep(即 EntityPart)转换为 dEntityPart 的 get 函数。 new 关键字在 class.
中隐藏基数 我想先确认一下这个理解是否正确。

这完全符合我的需要,但看起来很乱。我有很多这些 class 的推导集,每一个都有很多部分。这种方法感觉有点慢和麻烦。有没有一种方法可以将这种向下转换设置为始终存在,或者是否有一种方法可以设置一些泛型来像这样工作?

如果是这样的话,好吧。我可能对设置此类代码的更优雅的方法或更好的方法感兴趣。谢谢!

这对你有用吗?

    public class Entity<T> where T : EntityPart {
        public T ep;
    }
    public class EntityPart {
        public void eFunc() {}
    }
    public class dEntity : Entity<dEntityPart> {
        public void someFunc() {
            ep.derivedFunc(); // This won't throw an error anymore.
        }
    }
    public class dEntityPart : EntityPart {
        public void derivedFunc() {}
    }