我已经阅读了几篇关于这个问题的帖子,但似乎没有一个答案对我有用。情况是这样的——我有一个通用函数可以在另一个类中调用:
public class Dispatcher<T> where T : Event {
public void Notify<X>(X tEvent) where X : Event {
if (someField is IListener<X, T>) {
//this never executes--X is Event regardless of its derived type
}
}
}
和调用代码:
public class Effect {
public Event myEvent;
public CallNotify() {
Dispatcher.Notify(myEvent);
}
}
问题是 Event 有几十个派生类型,我需要 Notify() 调用以派生类型 X 发生。到目前为止,它只是调用 Notify< Event >() 无论我是哪种 Event传入。编译的唯一解决方案是调用 Notify(myEvent as DerivedEvent),但这必须针对每种类型进行硬编码——这是 Not Acceptable 。
如果我从派生类的实例中给它一个“this”指针,则类似的函数会正确推断。
肯定有一个使用反射的解决方案。
最佳答案
为了像您预期的那样调用它,您必须使用反射来生成 myEvent 的实际类型的方法。但我要强调的是,执行以下操作是一个坏主意,可能意味着您的设计需要重新考虑。
MethodInfo openGenericMethod = OtherClass.GetType().GetMethod("Notify");
MethodInfo closedGenericMethod = openGenericMethod.MakeGenericMethod(myEvent.GetType());
closedGenericMethod.Invoke(OtherClass, new object[]{ myEvent });,
我并没有实际测试上面的代码,但它看起来应该是这样的
关于c# - 如何将对象转换为它自己的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5554706/