Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 类型转换基类引用到其实际类型_C#_Casting_Polymorphism - Fatal编程技术网

C# 类型转换基类引用到其实际类型

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

我有一个类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=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#所拥有的。)