在c#中,当列表< object& gt;是给定的

本文关键字:gt object 列表 | 更新日期: 2023-09-27 18:04:13

我的方法看起来像:

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

I tried input.getType().GetGenericArguments()[0] == new PSObject().GetType())

但是input.getType().GetGenericArguments()[0]说它是对象类型…

在c#中,当列表< object& gt;是给定的

也许你的问题只是你正试图使用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))
    {...}
}

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

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

或者,如果您知道列表中的所有对象都是相同类型,则可以检查第一个项目(input[0])的类型,然后根据该类型对所有项目执行相同的操作。

但是input.getType().GetGenericArguments()[0]说它是对象类型…

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

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

现在,列表中的每个项可能不是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))
    {...}
}