質問

があるのに対して繰り返し処理を実行する(foreach好ましくは以ションコレクションを反映?私が繰り返し処理の性質を使って、オブジェクトの反射時のプログラムがあるタイプコレクションでの思いに対して繰り返し処理を実行する内容を収集できるアクセスのオブジェクトに収集します。

現在の属性セットのすべての物件、IsCollectionフラグをtrueに設定する物件。私のコードをチェックのためこの旗の場合はtrue、行動の便が良いことから、タイプを使用している。があるので、呼び出しGetEnumerator項目やかに収集できる対して繰り返し処理を実行するのだろう?

役に立ちましたか?

解決

私はこの問題ですが、の代わりに反射した結果、だけでチェック場合はIEnumerable.すべての回収を実施する。

if (item is IEnumerable)
{
    foreach (object o in (item as IEnumerable))
    {

    }
} else {
   // reflect over item
}

他のヒント

また、同様の手法としてDarrenことを示唆しただけに注意するだけでな回収を実施IEnumerable. string のためのインスタンスはIEnumerableまに対して繰り返し処理を実行します。

こちらは小さな機能を使用している場合にはオブジェクトで収集するenumerableでもICollectionはIEnumerable).

    public bool isCollection(object o)
    {
        return typeof(ICollection).IsAssignableFrom(o.GetType())
            || typeof(ICollection<>).IsAssignableFrom(o.GetType());
    }

んのプロパティの値としてキャストでIEnumerable.ここでは(未審査コードを知ることができるためのアイディア

ClassWithListProperty obj = new ClassWithListProperty();
obj.List.Add(1);
obj.List.Add(2);
obj.List.Add(3);

Type type = obj.GetType();
PropertyInfo listProperty = type.GetProperty("List", BindingFlags.Public);
IEnumerable listObject = (IEnumerable) listProperty.GetValue(obj, null);

foreach (int i in listObject)
    Console.Write(i); // should print out 123

最高の思いがインターネットオンラインの場合、オブジェクトを実装するコンインタフェース-そIEnumerableするすべてに合わせてご利用いただけます。それをうかがわせるものとなっている呼び出しGetEnumerator()をオブジェクトを使用IEnumerator.MoveNext()およびIEnumerator.現在の仕事をすることができるのです。

こんなき場合の収集を実装しない方面でそうなるとなんかコレクションだと思います。

だけの情報での人の手伝---あったかクラスの入れ子のクラスのその他の。たかったのを保存するプロパティ値のクラスにも入れ子のクラスおよび集ます。私のコードは:

 public void LogObject(object obj, int indent)
    {
        if (obj == null) return;
        string indentString = new string(' ', indent);
        Type objType = obj.GetType();
        PropertyInfo[] properties = objType.GetProperties();

        foreach (PropertyInfo property in properties)
        {
            Type tColl = typeof(ICollection<>);
            Type t = property.PropertyType;
            string name = property.Name;


            object propValue = property.GetValue(obj, null); 
            //check for nested classes as properties
            if (property.PropertyType.Assembly == objType.Assembly)
            {
                string _result = string.Format("{0}{1}:", indentString, property.Name);
                log.Info(_result);
                LogObject(propValue, indent + 2);
            }
            else
            {
                string _result = string.Format("{0}{1}: {2}", indentString, property.Name, propValue);
                log.Info(_result);
            }

            //check for collection
            if (t.IsGenericType && tColl.IsAssignableFrom(t.GetGenericTypeDefinition()) ||
                t.GetInterfaces().Any(x => x.IsGenericType && x.GetGenericTypeDefinition() == tColl))
            {
                //var get = property.GetGetMethod();
                IEnumerable listObject = (IEnumerable)property.GetValue(obj, null);
                if (listObject != null)
                {
                    foreach (object o in listObject)
                    {
                        LogObject(o, indent + 2);
                    }
                }
            }
        }
    }

るというこの機能

LogObject(obj, 0);

しかしをしているのか教えてくださいが構造体の中に授業をとったりする方法を見つけ出すことを数値です。Moreoevrいます。んが、その価値としてですか---。かばんデコードです。

の場合ご使用の反射きなものをインスタンスのオブジェクトです。というインスタンスを作成するには、この型のの動きに対して繰り返し処理を実行するのオブジェクトのプロパティを表示します。でご利用の場合は反射利用のConstructorInfo.Invoke()()(?) 法として新しいインスタンスを作成したポイントのインスタンスタイプです。

いているタイプです。FindInterfaces方法です。このフィルターを出すインタフェースを実装が指定されたタイプです。とPropertyInfo.PropertyType.FindInterfaces(filterMethod,filterObjects).フィルターできるIEnumerable、その結果が返されます。MSDNは例の方法。

いない場合は使用のインスタンスオブジェクトではなく、型には以下のようなものを使います:

// type is IEnumerable
if (type.GetInterface("IEnumerable") != null)
{
}

かなり簡単なアプローチする型にキャストオブジェクトを直接使用します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top