【问题标题】:IsAssignableFrom - what is the correct sequence of the parameters? Which is first and which is second?IsAssignableFrom - 参数的正确顺序是什么?哪个是第一,哪个是第二?
【发布时间】:2019-07-01 15:51:03
【问题描述】:

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

我尝试将其解读为“某事可从某事分配”,但这并不能帮助我记住。我将事物分配给 事物。我不会其他事物分配事物。

【问题讨论】:

  • 把函数想象成左侧赋值:{firstarg} 类型的变量可以保存 {secondarg} 的实例
  • 如果这应该对某人有所帮助,像IDoesItImplementThis 这样的名字是完全没用的(甚至不能从英语的角度理解)。使用IVehicleCarSpecificCar 或类似的东西。
  • @thehennyy - 这有帮助。我已将其添加到答案中。
  • 奇怪的反应。每次使用它时,我都会问自己同样的问题,并且我必须深入研究问题和答案以找到简洁的东西。我决定将我的问题和答案存储在 SO 上。我碰巧个人知道它有多大帮助。显然其他人不同意。哦,好吧。
  • 你怎么能忘记?写在方法名..

标签: c# .net reflection


【解决方案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))

【讨论】:

    【解决方案2】:

    现在我可以想象一种情况,当你想使用反射并询问类型是否可以从另一种类型分配。

    例如插件;

    当你想声明变量时,你必须定义这个变量的类型。

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

    【讨论】:

    • 在大多数情况下我们不需要反射。如果我们需要反思,很有可能我们做错了,我们不需要反思。如果我们在一个方法中有两个变量并且我们知道它们的类型是因为我们刚刚声明了它们,那么我们绝对不需要反射。
    • 但是这里我们谈论的是方法IsAssignableFrom()什么是基于反射的方法。
    猜你喜欢
    • 2016-10-20
    • 2010-11-29
    • 1970-01-01
    • 2011-04-04
    • 2011-10-22
    • 1970-01-01
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多