我做了这个扩展方法来检查一个类型是否实现了一个接口。要使其正常工作,它需要比较两种类型。然而,这种比较似乎并不现实:
public static bool ImplementsInterface(this Type type, Type testInterface)
{
if (testInterface.GenericTypeArguments.Length > 0)
{
return testInterface.IsAssignableFrom(type);
}
else
{
foreach (var @interface in type.GetInterfaces())
{
// This doesn't always work:
if (@interface == testInterface)
// But comparing the names instead always works!
// if (@interface.Name == testInterface.Name)
{
return true;
}
}
return false;
}
}
这是我比较失败的情况:
public static class TestInterfaceExtensions
{
interface I1 { }
interface I2<T> : I1 { }
class Class1Int : I2<int> { }
[Fact]
public void ImplementsInterface()
{
Assert.True(typeof(Class1Int).ImplementsInterface(typeof(I2<>)));
}
}
正如注释中提到的,如果我比较类型名,那么它总是按照预期工作。我想知道这是怎么回事。
如果接口是泛型的,则需要与泛型类型定义进行比较:
public static bool ImplementsInterface(this Type type, Type testInterface)
{
if (testInterface.GenericTypeArguments.Length > 0)
{
return testInterface.IsAssignableFrom(type);
}
else
{
foreach (var @interface in type.GetInterfaces())
{
var compareType = @interface.IsGenericType
? @interface.GetGenericTypeDefinition()
: @interface;
if (compareType == testInterface)
{
return true;
}
}
return false;
}
}
这适用于一堆测试用例:
Console.WriteLine(typeof(Class1Int).ImplementsInterface(typeof(I2<>))); // True
Console.WriteLine(typeof(Class1Int).ImplementsInterface(typeof(I2<int>))); // True
Console.WriteLine(typeof(Class1Int).ImplementsInterface(typeof(I2<bool>))); // False
Console.WriteLine(typeof(Class1Int).ImplementsInterface(typeof(I1))); // True
Console.WriteLine(typeof(Class1Int).ImplementsInterface(typeof(I3))); // False
实时示例:https://dotnetfiddle.net/bbslxh
比较两个NumPy数组是否相等的最简单方法是什么(其中相等定义为:A=B iff,用于所有索引i:
本文向大家介绍JavaScript比较两个对象是否相等的方法,包括了JavaScript比较两个对象是否相等的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JavaScript比较两个对象是否相等的方法。分享给大家供大家参考。具体如下: 在Python中可以通过cmp()内建函数来比较两个对象所包涵的数据是否相等(数组、序列、字典)。但是在javascript语言中并没有相关的实现。
问题内容: 比较两个NumPy数组是否相等的最简单方法是什么(其中相等定义为:对于所有索引i:,A = B iff )? 简单地使用就会给我一个布尔数组: 我是否必须确定该数组的元素是否相等,或者是否有更简单的比较方法? 问题答案: 测试数组(A == B)的所有值是否均为True。 注意:也许您还想测试A和B形状,例如 特殊情况和替代方法 (来自dbaupp的回答和yoavram的评论) 应当指
如何比较两个javascript集?我尝试使用和但都返回false。 这两个集合是等价的,因为根据定义,集合没有顺序(至少通常没有)。我看了MDN上的集合的留档,没有发现任何有用的东西。有人知道怎么做吗?
本文向大家介绍Java比较两个List的值是否相等的方法,包括了Java比较两个List的值是否相等的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java比较两个List的值是否相等的方法。分享给大家供大家参考。具体如下: 假设两个队列 {1,2,3,4} 和 {4,3,2,1} ,这个方法用来比较这两个队列中包含的值是否相等 希望本文所述对大家的java程序设计有所帮助。
问题内容: 在java中如何比较两个对象是否相等?何时使用equals和hashcode? 问题答案: 理论(针对语言律师和数学倾向者): (javadoc)必须定义一个等价关系(它必须是自反的,对称的和可传递的)。另外,它必须是一致的(如果未修改对象,则它必须保持返回相同的值)。此外,必须始终返回false。 (javadoc)也必须是一致的(如果未根据修改对象equals(),则它必须保持返回