2012-07-09 139 views
0

我有點新的反思,所以原諒我,如果這是一個更基本的問題我正在編寫一個程序在C#中,並試圖編寫一個通用的空或空檢查方法 到目前爲止代碼讀取,使用反射投出一個對象

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

不管你做什麼,移動測試空頂部的啓發。你現在有各種空解除引用。 – 2012-07-09 23:57:30

+0

這些對象來自哪裏,你失去了所有類型的信息? – bmm6o 2012-07-10 00:00:27

+0

任何地方我真的不在乎它只是一個通用的方法,我可以用我的程序來快速找出這個對象,即時處理是空的還是空的 - 而不是寫出我使用的每個特定項目的支票 – 2012-07-10 00:02:36

回答

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(); 
    } 
} 
+0

不能因爲生病使用這個標準對象列表alsosuch列表 2012-07-10 00:47:23

+0

@AlexKrups:對不起,不知道我是否按照問題所在。 '列表'對象可以通過這個傳入。 – 2012-07-10 00:52:21

+0

列表實現IEnumerable ,所以它將與此代碼一起工作,就像任何其他實現該接口的類一樣。在這種情況下,你真的需要讓類型系統爲你工作,而不是用反射來覆蓋所有的基礎。不要重新發明方形輪。 – FishBasketGordo 2012-07-10 01:56:17

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

+0

這適用於引用類型,但不適用於值類型。 – Siege 2012-07-10 00:41:07