C#:通用接口强制转换为基类型}publicclassOrderValidator:IValidator{//...}publicclassBaseEntity{}publicclassOrder:BaseEntity{}问题是我做不到:varvalidator=newOrderValidator();//这行抛出,因为无法转换类型varbaseValidator=(IValidator)validator;//所有这一切都是因为我需要一个包含IValidator、IValidator等的列表。IListallValidators=...我如何获取和存储基T的所有IValidator实现的列表-比如BaseEntity?目前我正在做非泛型IValidator,接受“objectobj”,但这很糟糕,不是类型安全的。有趣的是C#允许编译:vartest=(IValidator)newOrderValidator();但在运行时失败Unabletocastobjectoftype'OrderValidator'totype'IValidator`1[Orders.Core.BaseEntity]'这是Windsor给了我同样的异常(我试过Windsor和手动类型查找,问题是其实与此无关,只涉及接口转换)。多亏了Heinzi,我现在明白了为什么我不能转换-因为Order的IValidator期望Order是泛型类型。但是如何返回不同类型的IValidator列表呢?原因是BaseEntity采用其真实类型并收集所有验证器-从GetType()到Object的所有内容。我真的想要一个通用的GetValidators()然后对其进行操作。如果我解释为什么禁止这种转换,也许它可以帮助你:假设你有以下函数voidmyFunc(IValidatormyValidator){myValidator.IsValid(newBaseEntity());这段代码编译正确。但是,如果将OrderValidator传递给此函数,您将获得运行时异常,因为OrderValidator.IsValid需要一个Order而不是BaseEntity。如果允许您进行强制转换,则不再维护类型安全。编辑:C#4允许通用通用和逆变,但这对您的情况没有帮助,因为您使用T作为输入参数。因此,IValidator只能以类型安全的方式来完成。因此,明确地说,您不能将OrderValidator转换为IValidator,因为OrderValidator只能验证订单,而不是所有类型的BaseEntity。然而,这是IValidator所期望的。IValidator不起作用,因为IValidator和IValidator是完全不相关的类型。IValidator不是IValidator的子类型,因此无法进行转换。C#支持多接口继承,因此处理此问题的最简单方法是让订单验证器继承自两个验证器类型的接口,这样您就可以根据需要将其转换为任一接口。显然,这意味着您必须实现这两个接口并指定当??提供的BaseEntity与验证器的类型不匹配时如何处理基。像这样:publicclassOrderValidator:IValidator,IValidator{publicboolIsValid(Orderobj){//做验证//...returntrue;}publicboolIsValid(BaseEntityobj){OrderorderToValidate=objasOrder;if(orderToValidate!=null){returnIsValid(orderToValidate);}else{//Eiter这样做:thrownewInvalidOperationException("Thisisanordervalidatorsoyoucan'tvalidateobjectsthataren'torders");//或者这样:返回false;//取决于你想要达到的目标。这与Heinzi所说的无法转换有关,因为IValidator需要能够验证您当前的OrderValidator不能验证的BaseEntities。通过添加此多重接口,您可以显式定义validatingBaseEntities的行为(通过显式忽略它或引发异常),因此可以进行转换。虽然这不会直接回答你,但我建议你看看StructureMap的源代码,它们可以使用开放的通用类型。事实上,人们甚至可能想使用StructureMap来处理验证器的缓存,这正是我所做的。ForRequestedType(typeof(ValidationBase)).CacheBy(InstanceScope.Singleton);扫描(程序集=>{程序集.TheCallingAssembly();程序集.AddAllTypesOf(typeof(IValidation));});然后我有一个工厂类来做实际的验证publicstaticclassValidationFactory{publicstaticResultValidate(Tobj){返回验证器.Validate(obj);}catch(Exceptionex){...}}}编辑:我写了一篇关于使用IoC进行通用验证的很棒的博客文章,如果你看一看,既然你说你使用过Spring,我打赌你可以适应我的东西didtoyourproblem:Creatingagenericvalidationframework以上是C#学习教程:C#:强制转换为基类型的通用接口分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。涉及侵权,请点击维权联系管理员删除。如需转载请注明出处: