C# 在对象列表上调用公共类方法
我有一个对象列表:C# 在对象列表上调用公共类方法,c#,C#,我有一个对象列表: var objs = new List<object> { new A(1), new B(2,3), new C() }; 我知道我可以使用类名、方法名和反射来实现这一点,但是有没有类似于上面描述的方法呢 编辑:在每个类中定义Calculate()。A、B和C应派生自公共基类或实现一个接口,在该接口中声明Calculate()方法: public class CommonBase { public virtual int Cal
var objs = new List<object> {
new A(1),
new B(2,3),
new C()
};
我知道我可以使用类名、方法名和反射来实现这一点,但是有没有类似于上面描述的方法呢
编辑:在每个类中定义
Calculate()
。A
、B
和C
应派生自公共基类或实现一个接口,在该接口中声明Calculate()
方法:
public class CommonBase
{
public virtual int Calculate() => 0;
}
public class A : CommonBase
{
public override int Calculate() => 1;
}
...
然后,您可以将类型从List
更改为List
,并在所有对象上调用该方法,而无需执行任何强制转换或反射:
foreach(var o in objs)
{
o.Calculate();
}
编辑:使用
dynamic
关键字不会使您避免运行时错误。编译器确实允许您将没有Calculate()
方法的任何对象添加到列表
,但如果在对象上没有定义此类方法,则代码将在运行时失败。Doa
,B
和C
有一个带有Calculate
方法的公共基类或接口?听起来像是接口的完美用例。您可以使用List
并处理调用o时的时间。如果缺少该方法,则Calculate()
会失败。@Sean将类型从object更改为dynamic成功。谢谢@迈克:dynamic
不会让你免于运行时错误。编译器确实允许您将没有Calculate()
方法的任何对象添加到列表
,但是如果在对象上没有定义此类方法,则您的代码在运行时将失败。这确实比将类型更改为动态要好,谢谢!
foreach(var o in objs)
{
o.Calculate();
}