【发布时间】:2015-09-11 04:47:40
【问题描述】:
我想知道是否有一种方法可以在运行时确定调用它的类型。
[UPD2] 对于这种特殊情况,我只对调用者的类型感兴趣,而不是方法的名称,因此,How can I find the method that called the current method? 或 Retrieving the calling method name from within a method 等其他类似问题并不能解决我的问题。
为了简单起见,假设我有一个名为AnimalContainer 的类。
在初始化时,它的构造函数会收到一个允许的类型列表:允许将动物注册到容器的类型。
这个类(类似于 IoC 容器)的目标是为希望检索特定动物实例的任何类型充当容器。限制是只有任意一组类型才能将动物注册到容器中。然后,如果一个不允许的类型调用该方法,该方法将返回一个InvalidOperationException
期望类型或对象参数:
void RegisterAnimal(Type callerType, Animal animal) {...}
// Or
void RegisterAnimal(object invoker, Animal animal) {...}
这些不起作用,因为调用者不限于指定自己的类型(或实例)。例如:
// Inside class A:
animalContainer.RegisterAnimal(typeof(B), anyAnimal);
[UPD1] 我已经看到很多答案表明这似乎是一个糟糕的方法。如果你这样考虑,你会建议另一种方式吗?一般来说,我想要实现的是防御性编码。 按照惯例,我当然可以拥有允许在该容器中注册动物的一组类型。会发生什么,是否有任何其他不了解这种约定的开发人员尝试在一个不应该这样做的类中注册动物?它会做一些设计没有预料到的事情,所以,很可能最终会引入一些错误。 这只是我能找到的更简单的例子(The AnimalContainer),但它可以扩展到大量的情况:
- 拥有一组控制器类,可以将依赖项注册到 IoC 容器中。
- 拥有一个 MessageContainer,为不同类型之间的消息注册发布者和订阅者(将事件订阅者应该知道谁在发布事件这一事实分离)。然后指定只有一组类型可以发布给定消息。 例如:任何类都可以监听 NewAnimalArrive 消息,但只有一组特定的类可以触发该事件。
【问题讨论】:
-
那里有很大的旧代码气味。这不是骗子,因为他正在寻找调用者的 type。
-
这是一个奇怪且非常可疑的要求。您通常希望(并且可以轻松地)限制正在注册的类型。注册商应该不关心谁进行注册。