C# 类型转换基类引用到其实际类型
我有一个类BaseFilter和一些BaseFilter类的派生类C# 类型转换基类引用到其实际类型,c#,casting,polymorphism,C#,Casting,Polymorphism,我有一个类BaseFilter和一些BaseFilter类的派生类 1. List<base> list = getFilters(); 2. foreach(Base filter in list){ 3. var filterType = filter.GetType(); 4. var filter1 = filter as filterType; 5. //DO SOME DERIVED CLASS OPERATION 6. } 1。List=get
1. List<base> list = getFilters();
2. foreach(Base filter in list){
3. var filterType = filter.GetType();
4. var filter1 = filter as filterType;
5. //DO SOME DERIVED CLASS OPERATION
6. }
1。List=getFilters();
2.foreach(列表中的基本筛选器){
3.var filterType=filter.GetType();
4.var filter1=过滤器为过滤器类型;
5//执行一些派生类操作
6. }
我在代码行3处出错。挑战在于筛选器可以是任何派生类类型。有没有办法将筛选器对象类型转换为它的实际派生类
我遇到以下错误:
找不到类型或命名空间名称“filterType”(是否缺少using指令或程序集引用?)
正确的方法应该是什么
有没有办法将筛选器对象类型转换为它的实际派生类
不可以。您必须知道在编译时要转换到的类型
如果您不知道该类型,您如何知道要执行哪个操作?如果对所有类型执行相同的操作,则该操作应该(可能以抽象形式)出现在基类中
基本上,目前你的请求没有什么用处——但是如果你能提供更多关于你实际尝试做什么的细节,以及为什么你认为“转换为实际类型”是合适的,我们可能会为你提供更多帮助
在某些情况下,您可能会发现使用
dynamic
会有所帮助-但我只会在更干净的方法失败后作为最后手段使用它-在不知道您试图实现什么的情况下,我们不能就这些更干净的方法向您提供建议。正如Jon Skeet已经说过的,您不能在不知道类型的情况下强制转换到类型。但是,如果您在编译时知道少量派生类,则可以执行以下操作:
List<base> list = getFilters();
foreach(Base filter in list)
{
if(filter is DerivedFilter1)
{
var derived1 = filter as DerivedFilter1;
// do some DerivedFilter1 specific operations
}
else if(filter is DerivedFilter2)
{
var derived2 = filter as DerivedFilter2;
// do some DerivedFilter2 specific operations
}
else
{
// do some general operations
}
}
List List=getFilters();
foreach(列表中的基本筛选器)
{
如果(过滤器为衍生过滤器1)
{
var derived1=作为DerivedFilter1的过滤器;
//执行一些特定于DerivedFilter1的操作
}
else if(过滤器为衍生过滤器2)
{
var derived2=作为DerivedFilter2的过滤器;
//执行一些特定于DerivedFilter2的操作
}
其他的
{
//做一些常规操作
}
}
忽略此注释的早期版本,我现在明白了编译时已知的casted to类型的要点。请参阅:,-尝试搜索“tag:C#cast type object”。(考虑命名类型,例如接口或子类——这是C#所拥有的。)