错误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())
。
一个使用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方法而不会出现警告。