C# 强制转换到OrganizationServiceContext时出现InvalidCastException
我有一个由CrmSvcUtil生成的早期绑定类:C# 强制转换到OrganizationServiceContext时出现InvalidCastException,c#,generics,casting,microsoft-dynamics,C#,Generics,Casting,Microsoft Dynamics,我有一个由CrmSvcUtil生成的早期绑定类: public partial class CustomerCrmServiceContext : Microsoft.Xrm.Sdk.Client.OrganizationServiceContext { ... ... } 然后我有一个这样的类(简短版本): 我是这样使用这个类的: public abstract class PluginClassBase: IDisposable { ... ... prot
public partial class CustomerCrmServiceContext : Microsoft.Xrm.Sdk.Client.OrganizationServiceContext
{
...
...
}
然后我有一个这样的类(简短版本):
我是这样使用这个类的:
public abstract class PluginClassBase: IDisposable
{
...
...
protected readonly OrganizationServiceContext ServiceContext;
...
...
}
public class DoWomethingWorkerPlugin : PluginClass<account, CustomerCrmServiceContext>
{
...
}
这引发了一个InvalidCastException,说:
“无法强制转换类型为的对象
输入“Microsoft.Xrm.Sdk.Client.OrganizationServiceContext”
“Customer.DataModel.CustomerCrmServiceContext”
我很困惑,因为生成的类“CustomerCrmServiceContext”具有基类型“OrganizationServiceContext”,因此强制转换应该可以工作
当基类型相同时,有人知道什么会导致InvalidCastException吗?尽管
CustomerCrmServiceContext
是OrganizationServiceContext
,但事实并非如此,这就是为什么会出现异常
强制转换无法在运行时神奇地更改对象的类型
通过使用cast,您基本上告诉编译器“尽管您认为这个对象是SomeBaseType
,但我知道,在运行时,它将始终是SomeDerivedType
的一个实例,因此请将其视为一个实例”
如果在运行时发现该对象不是您试图强制转换的类型,您将得到一个
InvalidCastException
,并且OrganizationServiceContext
不是CustomerCrmServiceContext,尽管CustomerCrmServiceContext
是OrganizationServiceContext
,相反的情况并非如此,这就是为什么会出现异常
强制转换无法在运行时神奇地更改对象的类型
通过使用cast,您基本上告诉编译器“尽管您认为这个对象是SomeBaseType
,但我知道,在运行时,它将始终是SomeDerivedType
的一个实例,因此请将其视为一个实例”
如果在运行时发现该对象不是您试图强制转换到的类型,您将得到一个InvalidCastException
,而OrganizationServiceContext
不是CustomerCrmServiceContext@PaulRichardsonCustomerCrmServiceContext
是一个更具体的类型。它将对OrganizationServiceContext
具有附加行为,并且编译器无法知道如何将OrganizationServiceContext
的实例转换为CustomerCrmServiceContext
的实例,除非您定义了自定义转换运算符。当您使用CustomerCrmServiceContext
的实例代替OrganizationServiceContext
(可替换性)时,运行时类型不会更改,但是编译器知道它实现了OrganizationServiceContext
@PaulRichardsonCustomerCrmServiceContext
的所有行为,这是一种更具体的类型。它将对OrganizationServiceContext
具有附加行为,并且编译器无法知道如何将OrganizationServiceContext
的实例转换为CustomerCrmServiceContext
的实例,除非您定义了自定义转换运算符。当您使用CustomerCrmServiceContext
的实例代替OrganizationServiceContext
(可替换性)时,运行时类型不会更改,但编译器知道它实现了OrganizationServiceContext
的所有行为。
public class DoWomethingWorkerPlugin : PluginClass<account, CustomerCrmServiceContext>
{
...
}
ServiceContext = (C)base.ServiceContext;