【问题标题】:C#: How to use a variable like a type - not generic [duplicate]C#:如何使用像类型这样的变量-不是通用的[重复]
【发布时间】:2023-03-22 06:34:01
【问题描述】:

假设我有一个类 Animal,以及几个子类,Dog、Cat、Bird 等。

现在我有一个人,他有一个动物。她想看看宠物店有没有同类型的动物。

所以我有:

Animal sampleAnimal;
List<Animal> listOfAnimals;  // in our hypothetical pet store

当我尝试这样做时(在 C# 3.5 中):

Type typeWeWant = sampleAnimal.GetType();
foreach (var x in listOfAnimals) {
  if (x is typeWeWant) { // error here
     return true;
  }
}

我收到错误“typeWeWant 是一个变量,但用作类型。”

好的。我该怎么做?

请记住,我们的 Person 可能有一个 CalicoCat,它是 Cat 的子类,它应该与 Cat 匹配。所以使用 GetType.ToString() 是行不通的。 (在我的情况下,宠物并不完全是发生的事情 - 如果编写的代码有效,我会没事的。我不需要同时测试两种方式。)

如果已经有人问过这个问题,我深表歉意,但我能找到的只是关于泛型的问题,这里的情况并非如此。

编辑:非常感谢您的回答和“重复”链接!这些正是我需要但找不到的!

【问题讨论】:

  • 要重现您的代码,如果您可以添加更多代码,将会很有帮助。
  • 你在if to do x.GetType()中试过了吗?编辑:我认为您在 C# 3.5 中尝试做的事情是不可能的

标签: c# types


【解决方案1】:

你可以使用Type.IsAssignableFrom如下:

if (typeWeWant.IsAssignableFrom(x.GetType()))
    return true;

这涵盖了子类和类型相等的情况。

【讨论】:

    【解决方案2】:

    在 if 条件中使用任一

    if (x.GetType() == typeWeWant)
    

    或者,如果您需要查找所有类型的猫,包括猫的子类

    if (typeWeWant.IsSubclassOf(x.GetType())
    if (x.GetType().IsSubclassOf(typeWeWant)
    

    【讨论】:

    • 你不能这样使用 IsSubclassOf。 IsSubclassOf 是 Type 的成员 - 所以你可以使用 x.GetType().IsSubclassOf(typeWeWant)
    • @IvanSalo,谢谢,忘记了。编辑了答案。
    • This method also returns false if c and the current Type are equal. from docs.microsoft.com/en-us/dotnet/api/… (我怀疑这是你想要的)。我认为IsAssignableFrom 可能会更好。
    【解决方案3】:

    你可以这样做:

    Type typeWeWant = sampleAnimal.GetType();
    foreach (var x in listOfAnimals) {
      // with check only by type of typeWeWant
      if (x.GetType() == typeWeWant) {
         return true;
      }
      // depends on your needs you can use one of following
      // will check if typeWeWant is subclass of x
      if (typeWeWant.IsSubclassOf(x.GetType()) {
         return true;
      }
      // will check if x is subclass of typeWeWant
      if (x.GetType().IsSubclassOf(typeWeWant)) {
         return true;
      }
    }
    

    【讨论】:

    • 我...如果我错了,请纠正我,但它会编译,但不会工作,因为 typeof(typeWeWant)Type,而不是 Animal 或其子代。
    • 是否值得解释一下此检查与is 检查的不同之处完全,以及它们的结果可能有何不同?
    • 检查子类请使用typeWeWant.IsSubclassOf(x.GetType())x.GetType().IsSubclassOf(typeWeWant)取决于您的需要
    【解决方案4】:

    玩了一会,这就是我的工作:

     Type typeWeWant = sampleAnimal.GetType();
     foreach (var x in listOfAnimals)
     {
         if (typeWeWant.IsInstanceOfType(x))
         {
             return true;
         }
     }
    

    这也有效:

    Type typeWeWant = sampleAnimal.GetType();
    foreach (var x in listOfAnimals)
    {
        if (typeWeWant.IsSubclassOf(x.GetType()))
        {
            return true;
        }
    }
    

    【讨论】:

    • 它必须对两者进行测试:IsInstanceOf 仅测试它是否完全相同;如果它们是完全相同的类,IsSubclassOf 返回 false!
    • 啊,好吧,我明白了,好地方!
    猜你喜欢
    • 1970-01-01
    • 2020-05-28
    • 1970-01-01
    • 2010-10-19
    • 2018-12-10
    • 2013-11-25
    • 1970-01-01
    • 2013-12-17
    • 1970-01-01
    相关资源
    最近更新 更多