我的方法看起来像:
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]
表示它是对象类型......
答案 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))
{...}
}