我对反思有点新意,请原谅我,如果这是一个更基本的问题,我正在用c#编写一个程序,我正在尝试编写一个通用的Empty或null checker方法 到目前为止,代码读作
public static class EmptyNull
{
public static bool EmptyNullChecker(Object o)
{
try
{
var ob = (object[]) o;
if (ob == null || !ob.Any())
return true;
}
catch (Exception e)// i could use genercs to figure out if this a array but //figured i just catch the exception
{Console.WriteLine(e);}
try
{
if (o.GetType().GetGenericTypeDefinition().Equals("System.Collections.Generic.List`1[T]"))
//the following line is where the code goes haywire
var ob = (List<o.GetType().GetGenericArguments()[0].ReflectedType>)o;
if (ob == null || !ob.Any())
return true;
}
catch (Exception e)
{ Console.WriteLine(e); }
return o == null || o.ToString().Equals("");//the only thing that can return "" after a toString() is a string that ="", if its null will return objects placeMarker
}
}
现在很明显,对于一个列表,我需要一种方法来弄清楚它是什么类型的泛型列表,所以我想用反射来弄清楚,然后用反射投射它是可能的
谢谢
答案 0 :(得分:9)
如果你想要的只是一个方法,如果一个对象是null,或者如果该对象是一个空的可枚举,则返回true,我不会使用反射。几种扩展方法怎么样?我认为它会更清洁:
public static class Extensions
{
public static bool IsNullOrEmpty(this object obj)
{
return obj == null;
}
public static bool IsNullOrEmpty<T>(this IEnumerable<T> obj)
{
return obj == null || !obj.Any();
}
}
答案 1 :(得分:3)
如果您使用的是.NET 4,则可以考虑IEnumerable<out T>
对协方差的新支持,并将其写为:
public static bool EmptyNullChecker(Object o)
{
IEnumerable<object> asCollection = o as IEnumerable<object>;
return o != null && asCollection != null && !asCollection.Any();
}
然而,我会建议一个更好的名字,例如受string.IsNullOrEmpty 启发的名字
答案 2 :(得分:0)