IsAssignableFrom-哪种类型的参数去哪里?哪个第一,第二个?

时间:2019-07-01 15:51:03

标签: c# .net reflection

每次我使用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));

我尝试将其理解为“某物可从某物分配”,但这并没有帮助我记住。我将事物分配给。我不会从其他东西中分配东西。

2 个答案:

答案 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'))