c# - 如何将对象转换为它自己的类型?

标签 c# generics casting

我已经阅读了几篇关于这个问题的帖子,但似乎没有一个答案对我有用。情况是这样的——我有一个通用函数可以在另一个类中调用:

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/

相关文章:

c# - 如何使用参数在 c# 中调用 powershell 脚本

c - 如何使用 C 在 64 位平台上将 void* 转换为 int?

javascript - Mozilla ctypes,从 c 数组提供 Arraybuffer

c# - 获取解决方案中的所有 nuget 包

c# - Python 中的参数可以是逆变的还是协变的?

c# - 了解 csproj 程序集引用

swift - 为两种不同类型的数据管理单个变量

c# - MVC 通用存储库过滤

python - 在类型别名中使用泛型

python - 如何在(Python 的)sympy 中将 float 转换为 int?