请问 C# 中如何在集合中存入不同类型的值?

public class Animal { /**/ }
interface I_CommonSkill {
    void Say();
}
 
public class Cat : Animal, I_CommonSkill
{
    public int age = 2;
    public void Say () { /*say age*/ };
}
 
public class Dog : Animal, I_commonSkill
{
    public string name = "ergou";
    public void Say () { /*say name*/ };
}

新手求问,如上结构希望有一个管理类来统一管理实例,比如将实例保存到 Hashtable 中循环调用子类的 Say 方法之类的,但是 Hashtable 中的元素类型都是 object 接下来就是各种报错,不是找不到属性就是找不到方法,现在只能结合泛型强制转换类型来调用方法和获取属性。

有什么方法让管理类在存储这些实例的时候知道对象是不同子类的实例?或者说该如何统一管理这些数据结构不同的对象呢?之前一直在用动态语言思维可能不太适用静态语言还望大佬们指点一二谢谢了……

阅读 1.4k
2 个回答

不是定义了接口吗,为什么不用?

var items = new List<I_CommonSkill>();
items.Add(new Cat());
items.Add(new Dog());

foreach (var item in items) {
    item.Say();
}
新手上路,请多包涵

C# 也有动态类型解析(dynamic类型),详见 内置引用类型 - C# 引用 - C# | Microsoft Learn #动态类型

dynamic 类型表示变量的使用和对其成员的引用绕过编译时类型检查。 改为在运行时解析这些操作。 dynamic 类型简化了对 COM API(例如 Office Automation API)、动态 API(例如 IronPython 库)和 HTML 文档对象模型 (DOM) 的访问。
在大多数情况下,dynamic 类型与 object 类型的行为类似。 具体而言,任何非 Null 表达式都可以转换为 dynamic 类型。 dynamic 类型与 object 的不同之处在于,编译器不会对包含类型 dynamic 的表达式的操作进行解析或类型检查。 编译器将有关该操作信息打包在一起,之后这些信息会用于在运行时评估操作。 在此过程中,dynamic 类型的变量会编译为 object 类型的变量。 因此,dynamic 类型只在编译时存在,在运行时则不存在。
logo
Microsoft
子站问答
访问
宣传栏