首页 > 解决方案 > 如何以更动态的方式设置 C# 向下转换

问题描述

如果标题不太对,请见谅。
我有一组我从中派生的基类。有一个主要的和一堆我可以添加到它的组件。

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

我的派生类显然非常适合我的所有虚函数。但这是我遇到的问题

    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; }
        }
    }

据我了解,这只是声明一个名为eptype的变量dEntityPart。这是一个属性,并且具有将base.ep(只是EntityPart)转换为dEntityPart. new关键字从类中隐藏基。
我想先仔细检查一下这种理解是否正确。

这就像我需要的那样工作,但看起来很乱。我有很多这些类的派生集,每一个都有很多部分。这种方法感觉有点慢和麻烦。有没有办法将这种向下转换设置为始终存在,或者可能有一种方法可以设置一些通用的像这样工作?

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

标签: c#oopdowncast

解决方案


这对你有用吗?

    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() {}
    }

推荐阅读