我试图根据条件动态调用类方法。这就是我这样做的方式
我有三个类实现单个接口
interface IReadFile
{
string DoStuff();
}
A,B,C三个类实现了上面的接口。
我正在尝试使用下面的代码将它们添加到哈希表中
_HashT.Add("a", new classA());
_HashT.Add("b", new classB());
_HashT.Add("c", new classC());
编译很好,但是会产生运行时错误。 {对象引用未设置为对象的实例。}
我计划将正确的类返回到接口类型,具体取决于与键值匹配的参数。如果我寄出一个。 ClassA返回到接口类型,并调用该方法。
IReadFile Obj = (IReadFile )_HashT["a"].GetType();
obj.DoStuff();
如何更正上面需要将对象添加到哈希表的部分?或者我需要使用不同的方法吗?所有类都在同一个程序集和命名空间中。
感谢您的时间。
答案 0 :(得分:7)
作为猜测,您尚未实例化_HashT
对象。
您需要在代码中的某处(可能是声明或构造函数)来实例化它:
HashTable _HashT = new HashTable();
如果您不这样做,_HashT
将为null
,add
对NullReferenceException
的尝试将因您获得{{1}}而失败。
答案 1 :(得分:2)
看来您正在看NullReferenceException
。根据您提供的有限代码,我会说很可能没有分配_HashT
变量。也可能是从您的一个类构造函数生成异常。
如果您使用Dictionary<>
,则可以使用以下代码从哈希表中添加和提取对象。
var hashtable = new Dictionary<IReadFile>();
hashtable.Add("a", new ClassA());
hashtable.Add("b", new ClassB());
hashtable.Add("c", new ClassC());
IReadFile obj = hashtable["a"];
obj.DoStuff();
答案 2 :(得分:1)
按照您的方法,您无需就GetType()
提取的值调用_HashT
。该值应该已经是IReadFile
类型的对象。
答案 3 :(得分:0)
你为什么打电话给GetType
? IReadFile
对象是你在哈希中放置的东西。将Type
对象转换为IReadFile
并不会正确投射。