当前位置: 首页 > 编程语言 > C#

如何找到两种类型之间最适合的最小协变类型?分享

时间:2023-04-11 03:25:01 C#

如何在两种类型之间找到最适合的最小协变类型?IsAssignableFrom方法返回一个布尔值,指示一个类型是否可以从另一个类型赋值。我们如何测试它们是否可以相互分配,并且仍然知道最适合的协变类型最少?考虑以下示例(C#4.0)在上面的示例中,您要查找介于char[]和int[]之间的类型。更新:事实证明FindInterfaceWith可以简化,构建一个扁平的类型层次结构变得多余,因为基类不一定涉及,只要我们在它是接口时考虑类型本身;所以我添加了一个扩展方法GetInterfaces(bool)。由于我们可以按覆盖规则对交互进行排序,因此接口的排序交集是候选对象。如果他们都同样好,我想说没有一个会被认为是最好的。如果不是,那么最好的必须覆盖其中之一;并且由于它们是有序的,因此数组中最右边的两个接口应该存在这种关系,以指示存在最具体的最佳接口。使用Linq可以简化代码;但在我的场景中,我应该尽量减少对引用和命名空间的要求。有两种递归方法;一个是FindInterfaceWith,另一个是重要的方法FindInterfaceWith,因为已经有一个名为GetTypeArray的方法,其用法不同。它的工作原理类似于Akim提供的GetClassHierarchy方法;但在这个版本中,它构建了一个数组,如下所示:正如我们所知,它们按特定顺序排列,这就是它使事情正常进行的方式。构造的GetTypesArray数组实际上是一棵扁平化的树。该数组在模型中实际上是这样的:返回数组中的接口通过Array.Sort排序,并使用GetCoverageComparison提供的排序规则。有一些东西要提,比如在一些答案中不仅提到了多个接口实现的可能性(比如[this]);我已经定义了解决它们的方法,它们是:在问题[HowtofindtwotypesThesmallestassignabletype(repeated)in?],我说:但是,既然我们可以看一下FindAssignableWith方法,它必须根据最初的假设调用其他两个方法,这个矛盾的错误就神奇地消失了。关于so??rt接口的覆盖率比较规则,在delegateGetCoverageComparison中,我使用:关于方法FindBaseClassWith,它返回的东西和原来假设的不一样,有一个参数为null就返回null。它实际上返回了另一个传入的参数。这与问题【WhatshouldtheFindBaseClassWith`methodreturn?关于FindBaseClassWith方法链接。在目前的实现中我们可以调用它:我在某些情况下通过调用FindAssignableWith来测试代码如下:最简单的情况是遍历对象的基类型并检查它们是否可以用另一种类型赋值,如下所示:这会为两个不相关的类型生成System.Object(如果它们都是类)。我不确定这种行为是否符合您的要求。对于更高级的情况,我使用名为IsExtendablyAssignableFrom的自定义扩展方法。它可以处理不同的数字类型、泛型、接口、泛型参数、隐式转换、可为空、装箱/拆箱,以及我在实现自己的编译器时遇到的几乎所有类型。我已将代码上传到单独的github存储库[此处],以便您可以在您的项目中使用它。如果您只查看基类,问题就微不足道了,而Impworks的回答给出了一个解决方案(“遍历一个对象的父类并检查它们是否可以分配给另一种类型”)。但是如果你想包含接口,这个问题没有唯一的解决方案,因为你必须注意你自己的IDelta和ICharlie例子。两个或多个接口很容易同样“好”,因此没有单一的最佳解决方案。可以很容易地构造出任意复杂的接口继承图(graphs),从中不难看出没有明确定义的“FindAssignableWith”。此外,C#中的协变/逆变用于泛型类型的变体类型。让我举一个例子。我们有type1:System.Functype2:System.Func>当然,对于基类,“FindAssignableWith”可以是solutionA:System.MulticastDelegate但类型Func在其类型参数T中也是协变的(out)。所以类型solutionB:System.Func也是来自两个给定类型type1和type2的IsAssignableFrom意义上的解决方案。但对于solutionC:System.Func也可以这样说,因为字符串和元组都是IComparable。所以一般来说,没有唯一解。因此,除非您指定描述您想要的内容的精确规则,否则我们无法提出一种算法来找到解决方案。以上是C#学习教程:Howtofindthebestfittingminimumcovarianttypebetweentwotypes?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: