Как использовать оператор «is» в переменных System.Type? - PullRequest
3 голосов
/ 16 сентября 2008

вот что я делаю:

object ReturnMatch(System.Type type)  
{  
    foreach(object obj in myObjects)  
    {
        if (obj == type)  
        {  
            return obj;  
        }  
    }  
}  

Однако, если obj является подклассом type, он не будет совпадать. Но я бы хотел, чтобы функция возвращалась так же, как если бы я использовал оператор is.

Я попробовал следующее, но оно не скомпилируется:

if (obj is type) // won't compile in C# 2.0  

Лучшее решение, которое я придумал, было:

if (obj.GetType().Equals(type) || obj.GetType().IsSubclassOf(type))  

Нет ли способа использовать оператор is, чтобы сделать код чище?

Ответы [ 5 ]

4 голосов
/ 16 сентября 2008

Я использовал метод 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;
}

(Код записан из памяти и не проверен)

2 голосов
/ 16 сентября 2008

Не используется оператор is, но метод Type.IsInstanceOfType, по-видимому, является тем, что вы ищете.

http://msdn.microsoft.com/en-us/library/system.type.isinstanceoftype.aspx

2 голосов
/ 16 сентября 2008

Возможно

type.IsAssignableFrom(obj.GetType())
0 голосов
/ 16 сентября 2008

Есть ли причина, по которой вы не можете использовать само ключевое слово "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());

      }
    }
  }
0 голосов
/ 16 сентября 2008

Оператор is указывает, будет ли «безопасно» приводить один объект в качестве другого объекта (часто суперкласса).

if(obj is type)

если obj имеет тип 'type' или его подкласс, то оператор if будет успешным, так как «безопасно» приводить obj как (type) obj.

см .: http://msdn.microsoft.com/en-us/library/scekt9xw(VS.71).aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...