在c#中,如何在给出List <object>时确定对象的类型?</object>

时间:2013-03-15 19:24:00

标签: c# list types covariance contravariance

我的方法看起来像:

Boolean actions(List<Object> input)
{
    if (input.element is String)
    {...}
    else if (input.element is PSObject)
    {...}
}

我尝试了input.getType().GetGenericArguments()[0] == new PSObject().GetType())

input.getType().GetGenericArguments()[0]表示它是对象类型......

3 个答案:

答案 0 :(得分:7)

也许您的问题只是您尝试使用input.element从列表中获取项目。这不是检查列表中元素类型的正确方法。

只需使用它来测试第一项:

bool actions(List<Object> input)
{
    var element = input.FirstOrDefault();
    if (element is String)
    {...}
    else if (element is PSObject)
    {...}
}

或者这可以单独测试每个项目:

bool actions(List<Object> input)
{
    foreach (var element in input)
    {
        if (element is String)
        {...}
        else if (element is PSObject)
        {...}
    }
}

或者,如果您想确保列表的所有元素都是给定类型,您可以使用泛型:

bool actions<T>(List<T> input)
{
    if (typeof(String).IsAssignableFrom(typeof(T))
    {...}
    else if (typeof(PSObject).IsAssignableFrom(typeof(T))
    {...}
}

答案 1 :(得分:2)

您必须获取列表中实例的类型,而不是列表的类型。

Boolean actions(List<Object> input) {
  foreach (object o in input) {
    if (o is String) {
      ...
    } else if (o is PSObject) {
      ...
    }
  }
}

或者,如果您知道列表中的所有对象属于同一类型,则可以检查第一个项目的类型(input[0]),然后对所有项目执行相同的操作,具体取决于此。

答案 2 :(得分:2)

  

但是input.getType()。GetGenericArguments()[0]表示它是对象类型......

好吧,由于List<T>是不变的,传入的列表的泛型参数将始终完全匹配方法参数的泛型参数。

在这种情况下,列表始终object的列表。

现在,列表中的每个项目可能不是object(因为它是派生类型最多),它可以是字符串,也可以是PSObject。但是,您不能假设所有都是object以外的任何类型。

因此,您可以检查列表中的特定项目是否有更多派生类型,但不是整个列表中的派生类型。

因此,您更有可能必须重构代码:

Boolean actions(List<Object> input)
{
    foreach(object element in input)
    {
        if (element is String)
        {...}
        else if (element is PSObject)
        {...}
    }
}

如果所有项目属于同一类型很重要,那么您可以使用泛型:

Boolean actions<T>(List<T> input)
{
    if (typeof(T) == typeof(string))
    {...}
    if(typeof(T) == typeof(PSObject))
    {...}
}