8

ジェネリック パラメーターを受け取るメソッドを作成し、そのプロパティを出力します。これを使用して、Web サービスをテストします。動作していますが、実装方法がわからない機能をいくつか追加したいと考えています。リストの値を出力したいのは、期待される System.Collection.Generic.List1 を書き込むだけだからです。

これまでのコードは次のとおりです。これは基本的な型 (int、double など) で機能しています。

static void printReturnedProperties<T>(T Object)
{ 
   PropertyInfo[] propertyInfos = null;
   propertyInfos = Object.GetType().GetProperties();

   foreach (var item in propertyInfos)
      Console.WriteLine(item.Name + ": " + item.GetValue(Object).ToString());
}
4

6 に答える 6

9

次のようなことができます。

    static void printReturnedProperties(Object o)
    {
        PropertyInfo[] propertyInfos = null;
        propertyInfos = o.GetType().GetProperties();



        foreach (var item in propertyInfos)
        {
            var prop = item.GetValue(o);

            if(prop == null)
            {
                Console.WriteLine(item.Name + ": NULL");
            }
            else
            {
                Console.WriteLine(item.Name + ": " + prop.ToString());
            }


            if (prop is IEnumerable)
            {
                foreach (var listitem in prop as IEnumerable)
                {
                    Console.WriteLine("Item: " + listitem.ToString());
                }
            }
        }


    }

次に、任意の IEnumerable を列挙し、個々の値を出力します (1 行に 1 つずつ出力していますが、明らかに別の方法も可能です)。

于 2013-03-05T21:32:29.110 に答える
4

リスト内の要素は、インデクサー プロパティを介して取得できますItem。このプロパティは、インデックス引数を受け入れ ( のように、配列PropertyInfo.GetValueを受け入れるのオーバーロードがあります)、その位置にあるオブジェクトを返します。objectMethodInfo.Invoke

int index = /* the index you want to get here */;
PropertyInfo indexer = Object.GetProperty("Item");
object item = indexer.GetValue(Object, new object[] { index });
于 2013-03-05T21:17:23.870 に答える
2

,私は通常、各項目の間にリストを印刷します。

簡単にするために、単純な拡張メソッドを作成しました。

public static class ListEx
{
    public static string StringJoin<T>(this IEnumerable<T> items)
    {
        return string.Join(", ", items);
    }
}

としてメソッドを呼び出しmyList.StringJoin()ます。

もちろん、メソッドを変更して、別の区切り文字 och 呼び出しstring.Joinを直接使用することもできます。

于 2013-03-05T21:18:48.537 に答える
1

リストがタイプ T であると仮定したスニペットを次に示します。

 foreach (PropertyInfo item in propertyInfos)
            {
                Object obj = item.GetValue(object,null);
                if (!obj.GetType().IsValueType)
                {
                    if (obj.GetType() == typeof(String))
                    {
                        Console.WriteLine(obj.ToString());
                    }
                    else if (obj.GetType() == typeof(List<T>))
                    {
                        //run a loop and print the list

                    }
                    else if (obj.GetType().IsArray) // this means its Array
                    {
                        //run a loop to print the array
                    }

                }
                else
                {
                    //its primitive so we will convert to string 
                    Console.WriteLine(obj.ToString());

                }
于 2013-03-05T21:32:31.180 に答える
1

私はあなたがこのようなものが欲しいと思います:

public class Program
{
    public static void PrintProperties<T>(T t)
    {
        var properties = t.GetType().GetProperties();

        foreach (var property in properties)
        {
            var name = property.Name;
            var value = property.GetValue(t, null);

            if (property.PropertyType.IsGenericType && property.PropertyType == typeof(IEnumerable<>))
            {
                var formatList = typeof(Program).GetMethod("FormatList", new[] { value.GetType() });

                // value.GetType().GetGenericArguments().First() will get you the underlying type of the list,
                // i.e., the TItemType where the property you are currently
                // handling is of type IEnumerable<TItemType>
                formatList.MakeGenericMethod(value.GetType().GetGenericArguments().First());

                value = formatList.Invoke(null, new object[] { value });

                Console.Out.WriteLine(name + ": " + value);
            }
            else
            {
                Console.Out.WriteLine(name + ": " + value);
            }
        }
    }

    public static string FormatList<TPlaceholder>(IEnumerable<TPlaceholder> l)
    {
        return string.Join(", ", l);
    }
}

コードはテストされていませんが、基本的には、スカラー値と比較して列挙可能な型に別の方法で取り組みたいため、 type の何かにヒットしIEnumerable<TItemType>たら、メソッドを呼び出しますFormatList<TPlaceholder>

ここで、元のTTItemTypeは必ずしも同じではないことに注意してください。リフレクションを使用して FormatList を呼び出すときは、 を にバインドTPlaceholderTItemTypeます。それが完了したら、フォーマット メソッドを呼び出して、文字列を返すリストの実際のインスタンスを渡すだけです。その文字列を出力できます。

それが役立つことを願っています。

于 2013-03-05T21:40:51.293 に答える