每次我使用IsAssignableFrom
来查看某个类型是实现接口还是从基本类型继承时,我都会忘记哪个参数在哪里。 documentation很长。我总是最终写一个单元测试。
给出以下类型:
public interface IVehicle {}
public class VehicleBase { }
public class Car : VehicleBase , IVehicle { }
哪种方法是查看Car
实例是实现接口还是从基类继承的正确方法?
是这个吗?
var implements = typeof(IVehicle).IsAssignableFrom(typeof(Car));
var inherits = typeof(VehicleBase).IsAssignableFrom(typeof(Car));
还是相反?
var implements = typeof(Car).IsAssignableFrom(typeof(IVehicle));
var inherits = typeof(Car).IsAssignableFrom(typeof(VehicleBase));
我尝试将其理解为“某物可从某物分配”,但这并没有帮助我记住。我将事物分配给。我不会从其他东西中分配东西。
答案 0 :(得分:1)
它是这样的:
[TestMethod]
public void TheRightWay()
{
// this is what you want to check
var implements = typeof(IVehicle).IsAssignableFrom(typeof(Car));
var inherits = typeof(VehicleBase).IsAssignableFrom(typeof(Car));
Assert.IsTrue(implements);
Assert.IsTrue(inherits);
}
如果只想检查继承,则可以使用IsSubclassOf
,它更加直观。但是,如果您有两种类型,并且想知道是否有继承或接口实现-也许您不在乎-那么就可以做到。
这是一个记忆辅助工具:
IVehicle vehicle = new Car();
IsAssignableFrom
检查的参数顺序相同:
typeof(IVehicle).IsAssignableFrom(typeof(Car))
答案 1 :(得分:0)
现在我可以想像一种情况,当您想使用反射并询问类型是否可以从另一种类型分配时。
例如插件;
要声明变量时,必须定义此变量的类型。
SomeType variableName;
然后是问题..您可以为该variableName
变量分配什么样的实例?
答案:只是从SomeType
类型派生的类型的实例。
现在更多真实的例子:
Color variableName;
Int32 myInt;
然后我有一个问题:
variableName
是否可以从myInt
变量中分配?
答案是:不
现在,如果您使用反射。
typeof(Color).IsAssignableFrom(typeof(Int32))
结果是False
,所以每次都想想可以在哪里分配什么。很简单。
另一种可能的方式:
// left side of assignment = right side of assignment;
typeof({type of variable on the left side of assignment}).IsAssignableFrom(typeof({type of variable on the right side of assignment}))
关于我提到的插件。 通常,您可以尝试查找所有程序集并进行类似的循环。
那么您就可以
When my type 't' is implementing my 'contract type / interface' i want to instantiate it
and then is question
Is my 'contract / interface ' assignable from discovered type 't' ?
and again we have left and right side and result
typeof(my contract interface ).IsAssignableFrom(typeof( discovered type 't'))