列表中的c#继承

列表中的c#继承,c#,xml,list,inheritance,C#,Xml,List,Inheritance,我正在尝试构建一个XML解释器,并且有很多继承在进行。当我有一个列表,并且我想访问特定类型的抽象时,有没有一种简单的方法可以做到这一点?这就是我目前正在做的: abstract class Foo{} class iFoo : Foo { int bar; } class xFoo : Foo { string bar; } class Main { List<Foo> fooList; public static void Main (string[]ar

我正在尝试构建一个XML解释器,并且有很多继承在进行。当我有一个列表,并且我想访问特定类型的抽象时,有没有一种简单的方法可以做到这一点?这就是我目前正在做的:

abstract class Foo{}
class iFoo : Foo
{
   int bar;
}
class xFoo : Foo
{
   string bar;
}

class Main
{
 List<Foo> fooList;
     public static void Main (string[]args)
     {
         iFoo iBar = fooList[0] as IFoo;
         xFoo xBar = fooList[1] as XFoo;
         iBar.bar = 10;
         xBar.bar = "hello world";
     }
}
您可以像这样使用关键字:

fooList[0](as type iFoo).bar = 10;
(fooList[0] as IFoo).bar = 10;
dynamic instance = fooList[0];
instance.bar = value;


如果知道实例上有哪些属性或方法,可以强制转换为
动态
,这样编译器就不会干扰它

它看起来是这样的:

fooList[0](as type iFoo).bar = 10;
(fooList[0] as IFoo).bar = 10;
dynamic instance = fooList[0];
instance.bar = value;
value
是要分配的值的占位符。

但是请记住,操作必须是有效的。不能仅仅因为强制转换到
动态

没有类型
iBar
,就将
字符串
分配给
int
。你是说
(愚人[0]作为IFoo)。bar=10?任何访问子属性的操作都不会是类型安全的,除非您有验证基础类型的代码。如果愚人[0]
是一个
XFoo
而不是
IFoo
,该怎么办?如果您提前知道结构,也许您应该查看不同于
Foo
s列表的结构。在使用
as
时,确实应该检查
null
,以防止null引用异常。