C# 如何使用;是";系统中的运算符。类型变量?

C# 如何使用;是";系统中的运算符。类型变量?,c#,C#,以下是我正在做的一件事: object ReturnMatch(System.Type type) { foreach(object obj in myObjects) { if (obj == type) { return obj; } } } 但是,如果obj是类型的子类,则它将不匹配。但是我希望函数返回的方式与我使用运算符is时的返回方式相同 我尝试了以下操

以下是我正在做的一件事:

object ReturnMatch(System.Type type)  
{  
    foreach(object obj in myObjects)  
    {
        if (obj == type)  
        {  
            return obj;  
        }  
    }  
}  
但是,如果obj是
类型的子类
,则它将不匹配。但是我希望函数返回的方式与我使用运算符
is
时的返回方式相同

我尝试了以下操作,但无法编译:

if (obj is type) // won't compile in C# 2.0  
我想出的最佳解决方案是:

if (obj.GetType().Equals(type) || obj.GetType().IsSubclassOf(type))  
难道没有办法使用操作符
is
使代码更干净吗?

也许吧

type.IsAssignableFrom(obj.GetType())

is操作符指示将一个对象强制转换为另一个对象(通常是一个超类)是否“安全”

如果obj是“type”类型或其子类,则if语句将成功,因为将obj强制转换为(type)obj是“安全的”


请参阅:

您不能使用“Is”关键字本身有什么原因吗

foreach(object obj in myObjects)
{
  if (obj is type)
  {
    return obj;
  }
}
编辑-我看到我遗漏了什么。伊萨克的建议是正确的;我已经测试并确认了

  class Level1
  {
  }

  class Level2A : Level1
  {
  }

  class Level2B : Level1
  {
  }

  class Level3A2A : Level2A
  {
  }


  class Program
  {
    static void Main(string[] args)
    {
      object[] objects = new object[] {"testing", new Level1(), new Level2A(), new Level2B(), new Level3A2A(), new object() };


      ReturnMatch(typeof(Level1), objects);
      Console.ReadLine();
    }


    static void ReturnMatch(Type arbitraryType, object[] objects)
    {
      foreach (object obj in objects)
      {
        Type objType = obj.GetType();

        Console.Write(arbitraryType.ToString() + " is ");

        if (!arbitraryType.IsAssignableFrom(objType))
          Console.Write("not ");

        Console.WriteLine("assignable from " + objType.ToString());

      }
    }
  }

不使用is运算符,但Type.IsInstanceOfType方法似乎就是您要查找的方法


面对此问题时,我使用了IsAssignableFrom方法

Type theTypeWeWant; // From argument or whatever
foreach (object o in myCollection)
{
    if (theTypeWeWant.IsAssignableFrom(o.GetType))
         return o;
}
另一种可能对您的问题有效也可能无效的方法是使用通用方法:

private T FindObjectOfType<T>() where T: class
{
    foreach(object o in myCollection)
    {
        if (o is T)
             return (T) o;
    }
    return null;
}
private T FindObjectOfType(),其中T:class
{
foreach(myCollection中的对象o)
{
if(o是T)
返回(T)o;
}
返回null;
}
(代码是从内存中编写的,没有经过测试)

是的,有:C不允许这样做……啊,愚蠢的我,你不是在硬编码类型到代码本身,而是在传递类型变量以进行反射比较。
private T FindObjectOfType<T>() where T: class
{
    foreach(object o in myCollection)
    {
        if (o is T)
             return (T) o;
    }
    return null;
}