转换为 OrganizationServiceContext 时出现 InvalidCastException

InvalidCastException while casting to OrganizationServiceContext

我有一个由 CrmSvcUtil 生成的早期绑定 class:

public partial class CustomerCrmServiceContext : Microsoft.Xrm.Sdk.Client.OrganizationServiceContext
{
  ...
  ...
}

然后我有一个像这样的class(短版):

public abstract class PluginClass<T, C> : PluginClassBase<T> where T : Entity where C : OrganizationServiceContext
{
        protected new C ServiceContext;

        protected PluginClass(IOrganizationService service, ITracingService tracer) : base(service, tracer)
        {
            ServiceContext = (C)base.ServiceContext;
        }
}

而基础 class 是这样的:

public abstract class PluginClassBase: IDisposable
{
    ...
    ...
    protected readonly OrganizationServiceContext ServiceContext;
    ...
    ...
}

我正在这样使用 class:

public class DoWomethingWorkerPlugin : PluginClass<account, CustomerCrmServiceContext>
{
  ...
}

我的问题是以下语句:

ServiceContext = (C)base.ServiceContext;

这会抛出一个 InvalidCastException 说:

"Unable to cast object of type 'Microsoft.Xrm.Sdk.Client.OrganizationServiceContext' to type 'Customer.DataModel.CustomerCrmServiceContext"

我很困惑,因为生成的 class“CustomerCrmServiceContext”具有基本类型“OrganizationServiceContext”,因此转换应该有效。

有人知道当基类型相同时什么会导致 InvalidCastException 吗?

尽管 CustomerCrmServiceContextOrganizationServiceContext,但反之则不然,这就是为什么您会得到异常。

演员不能在运行时神奇地改变对象的类型。

通过使用强制转换,您实际上是在告诉编译器 “虽然您认为此对象是 SomeBaseType,但我知道,在运行时,它始终是 [=13] 的实例=] 所以请这样对待它".

如果在运行时发现对象不是您尝试转换为的类型,您将得到一个 InvalidCastException,并且 OrganizationServiceContext 不是 CustomerCrmServiceContext.