如何以更动态的方式设置C#downcasting

如何以更动态的方式设置C#downcasting,c#,oop,downcast,C#,Oop,Downcast,如果标题不正确,请道歉。 我有一组基类,我是从中派生出来的。我可以添加一个主要的组件和一堆组件 公共类实体{ 公共实体艺术ep; } 公共类实体艺术{ public void eFunc(){} } 显然,我的派生类对于我所有的虚函数都能完美地工作。但我遇到了一个问题 公共类身份:实体{ public void someFunc(){ ep.derivedFunc();//错误,在EntityPart上不存在 } } 公共类牙科零件:EntityPart{ public void derive

如果标题不正确,请道歉。
我有一组基类,我是从中派生出来的。我可以添加一个主要的组件和一堆组件

公共类实体{
公共实体艺术ep;
}
公共类实体艺术{
public void eFunc(){}
}
显然,我的派生类对于我所有的虚函数都能完美地工作。但我遇到了一个问题

公共类身份:实体{
public void someFunc(){
ep.derivedFunc();//错误,在EntityPart上不存在
}
}
公共类牙科零件:EntityPart{
public void derivedFunc(){}
}
我很快就弄明白发生了什么。由于
ep
仍然只是一个
EntityPart
,因此它没有派生的功能

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

公共类身份:实体{
公共新牙形艺术ep{
获取{return(dEntityPart)base.ep;}
}
}
据我所知,这只是将名为
ep
的变量声明为类型
dEntityPart
。这是一个属性,具有将
base.ep
(即
EntityPart
)转换为
dEntityPart
的get函数。
new
关键字在类内隐藏base。
我想先仔细检查一下这种理解是否正确

这正是我所需要的,但它看起来很混乱。我有很多这些类的派生集,每个都有很多部分。这种方法感觉有点慢和麻烦。有没有一种方法可以设置这种向下转换,使其始终存在,或者有没有一种方法可以设置一些泛型,使其像这样工作


如果是这样的话,好的。我感兴趣的可能是一种更优雅的方法或更好的方法来设置这样的代码。谢谢

这对你有用吗

    public class Entity<T> where T : EntityPart {
        public T ep;
    }
    public class EntityPart {
        public void eFunc() {}
    }
公共类实体,其中T:EntityPart{
公共教育;
}
公共类实体艺术{
public void eFunc(){}
}
公共类身份:实体{
public void someFunc(){
ep.derivedFunc();//这将不再抛出错误。
}
}
公共类牙科零件:EntityPart{
public void derivedFunc(){}
}

这对你有用吗

    public class Entity<T> where T : EntityPart {
        public T ep;
    }
    public class EntityPart {
        public void eFunc() {}
    }
公共类实体,其中T:EntityPart{
公共教育;
}
公共类实体艺术{
public void eFunc(){}
}
公共类身份:实体{
public void someFunc(){
ep.derivedFunc();//这将不再抛出错误。
}
}
公共类牙科零件:EntityPart{
public void derivedFunc(){}
}

看起来你在找?看起来你在找?看起来就是这样!不确定为什么我似乎找不到答案。谢谢你。介意我在这里继续跟进吗?我可能有许多
EntityParts
的派生,一个实体上可能有多达5或6个不同的部分。这似乎会让宣言变得满嘴脏话。你认为这会是一个问题吗,或者有办法解决这样的问题吗?不管你选择怎样继续,这确实会是一个问题。您可能需要一个
实体
声明(我只见过Func有这么多声明),或者需要很多样板代码。如果一切都是一部分,你就不能找到共同的功能,并使用它作为一种不人道的打算吗?我将不得不把它放在我的工作,看看它去了谁。虽然它们都是部分,但它们各自负责一些不同的功能。我试图创造一个相当模块化的设计。我会回复你的。你所拥有的一切都会起作用,但遗憾的是,我所使用的是,我不能这么直截了当地做到这一点。以防万一,除了我所拥有的,还有其他方法可以让我沮丧吗?看起来就是这样!不确定为什么我似乎找不到答案。谢谢你。介意我在这里继续跟进吗?我可能有许多
EntityParts
的派生,一个实体上可能有多达5或6个不同的部分。这似乎会让宣言变得满嘴脏话。你认为这会是一个问题吗,或者有办法解决这样的问题吗?不管你选择怎样继续,这确实会是一个问题。您可能需要一个
实体
声明(我只见过Func有这么多声明),或者需要很多样板代码。如果一切都是一部分,你就不能找到共同的功能,并使用它作为一种不人道的打算吗?我将不得不把它放在我的工作,看看它去了谁。虽然它们都是部分,但它们各自负责一些不同的功能。我试图创造一个相当模块化的设计。我会回复你的。你所拥有的一切都会起作用,但遗憾的是,我所使用的是,我不能这么直截了当地做到这一点。以防万一,除了我所拥有的,还有别的方法让我沮丧吗?