我需要将字符串列表转换为对象列表,但问题是我接收此列表作为对象,因为它是一个参数,我不知道它是什么类型。
这是接收参数的函数:
public static bool IsNotEmpty(object obj)
{
if (obj is ICollection)
{
IList<object> collection = (IList<object>)obj; // The cast throws error here
return IsNotEmpty(collection);
}
return true;
}
这就是这个人使用的那个:
public static bool IsNotEmpty<T>(IList<T> aList)
{
return aList != null && aList.IsNotEmpty();
}
如何将其作为对象列表进行转换,那么我可以将其传递给其他函数吗? (如果有办法)
答案 0 :(得分:8)
你正在做我们称之为&#34; XY问题&#34;:你有一个(错误的)解决方案,因为你的问题并且你正在询问你的错误解决方案,而不是寻求你的解决方案实际问题。
您首先不需要将字符串列表转换为对象列表,因此无需询问如何执行此操作。解决问题的正确方法是:
static class MyExtensions
{
public static bool Any(this IEnumerable sequence)
{
if (sequence == null)
throw new ArgumentNullException ... etc ...
if (sequence is ICollection)
return ((ICollection)sequence).Any();
foreach(object item in sequence)
return true;
return false;
}
public static bool Any(this ICollection collection)
{
if (collection == null) blah blah blah
return collection.Count > 0;
}
}
大。现在你的方法是:
public static bool IsNotEmpty(object obj)
{
if (obj is IEnumerable)
return ((IEnumerable)obj).Any();
else
return true;
}
这里的想法是首先进入收集,因为这样可以避免不必要地枚举序列。这可能很昂贵。但是如果我们有一个包含项但不是集合的序列,那么枚举它的第一个元素。如果我们能够成功地做到那么它就不是空的;如果我们做不到,那就是空的。
但更一般地说:你的方法的签名是不幸的。如果你可以避免它,请不要进入你手头有object
的情况。你是怎么进入这种情况的?
答案 1 :(得分:3)
public static bool IsNotEmpty(object obj)
{
var collection = obj as ICollection;
return collection == null || collection.Count > 0;
}