【发布时间】:2011-02-22 20:21:49
【问题描述】:
这是this question 的后续行动。如果您对背景故事感兴趣,请仅阅读它。
简而言之,我使用反射从程序集中加载一组泛型类型。程序集在运行时加载。
我的当前项目和我正在加载的包含接口的程序集都引用了第二个程序集:
IJobIJobWrapper(Of IJob)
我正在加载的程序集(称为Jobs.dll)包含一个JobWrapper(Of IJob) - 它实现了IJobWrapper 接口。
Jobs.dll 还包含多个实现IJob 的作业
现在,我将适当的类型加载到容器 (Unity) 中,并在需要时将它们拉出。这行得通(也就是说,容器会根据需要解析引用并实例化一个对象)
注意:下面的JobType 和JobWrapperType 是通过反射检索的。
具体来说:
Dim TypeArgs As Type() = {JobType}
Dim WrappedJob = JobWrapperType.MakeGenericType(TypeArgs)
Dim ContainerJob = Container.Resolve(WrappedJob)
Dim JobInstance = DirectCast(ContainerJob, IJobWrapper(Of IJob))
这里引发错误的是演员表的最后一行。
第 3 行的ContainerJob 在技术上是一个对象,因为我需要使用非泛型重载来进行解析(即类型参数不是“(Of XXX)”)。
根据调试器,实际上是MyProject.Jobs.JobWrapper(Of MyProject.Jobs.DailyStatusReport)
MyProject.Jobs.JobWrapper 实现IJobWrapper(Of IJob)
MyProject.Jobs.DailyStatusReport 实现 IJob
DirectCast 抛出此异常:
Unable to cast object of type 'MyProject.Jobs.JobWrapper`1[MyProject.Jobs.DailyStatusReport]' to type 'MyProject.JobService.Common.IJobWrapper`1[MyProject.JobService.Common.IJob]'.
有人可以解释为什么它不能做演员/如何绕过它吗?我想知道它是否在将引用程序集中定义的接口与Jobs.dll 中引用的接口匹配时遇到问题 - 但如果是这种情况,我不确定如何协调两者。
非常感谢。
编辑:
来自接口的示例方法:
我的工作:
Function ShouldExectute() As Boolean
Sub Execute()
IJobWrapper:
Function ShouldExectute() As Boolean
Sub Execute()
ReadOnly Property DatabaseId as Long
ReadOnly Property Name as String
ReadOnly Property IsDisabled As Boolean
例如 - Job Wrapper 不会返回任何与 IJob 类型相关的内容。它确实使用类型信息来查找已附加到实现 IJob 并读取信息的类的各种属性。
【问题讨论】:
标签: generics reflection .net-4.0 unity-container