我有一个哈希表,可以包含任意数量的对象。所有这些对象都实现了一些类似的方法/属性以及它们自己的一些。
例如,哈希表中的所有对象都可能有一个名为PrintText的方法,它采用string类型的单个参数。然而,所有对象都是从不同的类中实例化的。
我是否可以通过其键从哈希表中提取特定对象而不在运行时知道它的类型,并访问所有自己的方法和属性(不仅仅是常见的方法和属性)?
通常我会做类似的事情,
MyClass TheObject = MyHashTable [Key];
但是被拔出的对象可以从任何类派生,所以在这种情况下我不能这样做。
答案 0 :(得分:9)
您可以定义包含常用方法和属性的接口,并在所有类中实现此接口。然后,您可以轻松访问这些方法和属性。
但是要访问对象的特定方法(不包含在界面中),您需要知道对象的类型。
更新
你的问题并不清楚,但是当你写一个哈希表时,我认为你的意思是Hashtable class。在这种情况下,您应该查看generic Dictionary class(自.NET 2.0起可用)。这个类将使您的代码类型安全,并使您免于大量的类型转换,例如:
IMyInterface a = new MyObject();
// with Hashtable
Hashtable ht = new Hashtable();
ht.Add("key", a);
IMyInterface b = (IMyInterface)ht["key"];
// with Dictionary
var dic = new Dictionary<string, IMyInterface>();
dic.Add("key", a);
// no cast required, value objects are of type IMyInterface :
IMyInterface c = dic["key"];
答案 1 :(得分:1)
要解决常见方法和属性的问题,可以通过使类实现相同的接口来解决这些问题。但是,我不知道如何访问非共同成员。您可以尝试使用Reflection。
答案 2 :(得分:1)
动态C#4。反映早期版本。
编辑:在某些情况下,定义一个通用界面既可以是一种有效而清晰的方式来实现您描述的某种性质。 (“被接受的答案'和/或其他人提及的'启发' - 不记得时间表)
答案 3 :(得分:0)
你可以说:
object theObject = MyHashTable[Key];
然后你可以说:
theObject.GetType()
.GetMethod("PrintText")
.Invoke(theObject, new object[] {"paramvalue"});