在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]
说它是对象类型…
也许你的问题只是你正试图使用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))
{...}
}