【问题标题】:How to check if variable's type matches Type stored in a variable如何检查变量的类型是否与存储在变量中的类型匹配
【发布时间】:2012-05-12 00:25:15
【问题描述】:
User u = new User();
Type t = typeof(User);

u is User -> returns true

u is t -> compilation error

如何以这种方式测试某个变量是否属于某种类型?

【问题讨论】:

    标签: c# reflection types


    【解决方案1】:

    GetType() 存在于每个单一的框架类型上,因为它是在基础 object 类型上定义的。所以,不管类型本身,你都可以用它来返回底层的Type

    所以,你需要做的就是:

    u.GetType() == t
    

    【讨论】:

    • 实际上,Eric 的回答很有帮助,但并没有回答如何以原始问题中描述的“u is t”方式使用未知类型进行测试的实际问题,而你的回答也是如此。
    • @Daniel - 不完全是。戴夫的回答只有在您想排除 t 的子类时才是正确的。埃里克的回答主要解释了该怎么做;它只是缺少对“t”放置位置的说明。我会在那里添加评论。
    【解决方案2】:

    您需要查看您的实例的类型是否等于类的类型。要获取实例的类型,请使用 GetType() 方法:

     u.GetType().Equals(t);
    

     u.GetType.Equals(typeof(User));
    

    应该这样做。显然,如果您愿意,可以使用 '==' 进行比较。

    【讨论】:

    • +1 但更喜欢第二个选择。 u.GetType.Equals(typeof(User));
    • 这比使用 == 更不安全的一个原因是,如果 GetType() 以某种方式返回 null - 它会抛出。
    • @Fuex,是的,我认为如果 typeof 是内联的,它会使代码更容易阅读,这就是为什么我这样发布它,即使在 OPs 示例中他已经有一个变量t 包含类型。
    • @DaveBish 如果 GetType 返回 null,那么我会担心很多事情会开始抛出......但重点是,你当然是对的
    • @SamHolder 是的 - 唯一会发生这种情况的情况是,如果有人覆盖了基本类型,并以某种方式搞砸了实现。肯定会很奇怪。
    【解决方案3】:

    其他答案均存在重大遗漏。

    is 运算符检查操作数的运行时类型是否完全给定类型;相反,它会检查运行时类型是否与给定类型兼容

    class Animal {}
    class Tiger : Animal {}
    ...
    object x = new Tiger();
    bool b1 = x is Tiger; // true
    bool b2 = x is Animal; // true also! Every tiger is an animal.
    

    但是用反射检查 identity 来检查类型 identity,而不是 compatibility

    bool b5 = x.GetType() == typeof(Tiger); // true
    bool b6 = x.GetType() == typeof(Animal); // false! even though x is an animal
    
    or with the type variable
    bool b7 = t == typeof(Tiger); // true
    bool b8 = t == typeof(Animal); // false! even though x is an 
    

    如果这不是您想要的,那么您可能想要 IsAssignableFrom:

    bool b9 = typeof(Tiger).IsAssignableFrom(x.GetType()); // true
    bool b10 = typeof(Animal).IsAssignableFrom(x.GetType()); // true! A variable of type Animal may be assigned a Tiger.
    
    or with the type variable
    bool b11 = t.IsAssignableFrom(x.GetType()); // true
    bool b12 = t.IsAssignableFrom(x.GetType()); // true! A 
    

    【讨论】:

    • 虽然这里显示的最终方法有效,但它是不必要的冗长。 typeof(Animal).IsInstanceOfType(x)typeof(Animal).IsAssignableFrom(x.GetType()); 更短更直接(如果你使用后者,Resharper 会建议使用前者)。
    • 澄清:要回答原始问题,请将t 替换为typeof(Animal)。所以 Mark 改进后的形式变成了t.IsInstanceOfType(x)
    【解决方案4】:

    为了检查一个对象是否与给定的类型变量兼容,而不是写

    u is t
    

    你应该写

    typeof(t).IsInstanceOfType(u)
    

    【讨论】:

    • 更详细的语法与“u is t”语法相比有什么好处?
    • @KyleHumfeld 如果你有类型 foo;对象A;你不能写“A is foo”,但你可以写 foo.isInstanceOfType(A)
    猜你喜欢
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    相关资源
    最近更新 更多