错误Resharper建议“使用instanceoftype方法”

本文关键字:instanceoftype 方法 使用 Resharper 建议 错误 | 更新日期: 2023-09-27 18:07:49

对于未知类型的给定值,下面的扩展方法尝试查找具有单个参数的构造函数,以便可以使用该值调用构造函数。

private static ConstructorInfo ConstructorThatTakesValue
    (this Type thisType, object value)
{
    return thisType.GetConstructors().FirstOrDefault(c =>
        c.GetParameters().Count() == 1 &&
        c.GetParameters().First().ParameterType.IsAssignableFrom(value.GetType()));
}

也就是说,如果var c = typeof(X).ConstructorThatTakesValue(y),那么我们可以通过

创建x
var x = (X)c.Invoke(new object[] { y });

上面的代码像符咒一样工作,但是Resharper标记了包含IsAssignableFrom的行并显示"Use method InstanceOfType"。它还提供了一个快速修复字面上只是用IsInstanceOfType取代IsAssignableFrom,这是我的直觉与我想要实现的完全相反:

c.GetParameters().First().ParameterType.IsInstanceOfType(value.GetType()));

更可疑的是,这条消息显示为"建议",而不是警告之类的。也就是说,Resharper似乎认为这个改变是一个简单的风格改进。

我也试图理解这两个方法的语义,但我也无法掌握MSDN上文档的含义。我的理解是,如果class A : B,那么B.GetType().IsAssignableFrom(A.GetType())A.GetType().IsInstanceOfType(B.GetType())

错误Resharper建议“使用instanceoftype方法”

一个使用Types和Other实例,实际上一个调用另一个:

public virtual bool IsInstanceOfType(object o)
{
    if (o == null)
    {
        return false;
    }
    return this.IsAssignableFrom(o.GetType());
}

Kevin Cooks的回答很好,但是在Resharper的引擎中有一个疏忽:它与对象和类型没有区别(它将Type实例视为对象)。

例如,如果你的B参数是已经一个Type对象,它仍然会要求你切换到"IsInstanceOf"。这是假的,在这个非常有限的上下文中会导致错误。 编辑:我再次检查了我的测试用例,我发现它不再是这种情况。当第二个参数类型确实是type时,它会正确地使用IsAssignableFrom方法而不会出现警告。