0

私はリフレクションに少し慣れていないので、これがより基本的な質問である場合は許してくださいc#でプログラムを作成していて、コードが次のように読み取るまで、一般的なEmptyまたはnullチェッカーメソッドを作成しようとしています

 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
       }
    }

今明らかにリストの場合、それがどのタイプのジェネリックリストであるかを理解する方法が必要なので、リフレクションを使用してそれを理解し、そのリフレクションでキャストしたいのですが、これは可能です

ありがとうございました

4

3 に答える 3

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();
    }
}
于 2012-07-10T00:02:12.790 に答える
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にインスパイアされた名前など、より適切な名前を提案します。

于 2012-07-10T00:04:14.457 に答える