私はあなたがこのようなものが欲しいと思います:
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>
。
ここで、元のT
とTItemType
は必ずしも同じではないことに注意してください。リフレクションを使用して FormatList を呼び出すときは、 を にバインドTPlaceholder
しTItemType
ます。それが完了したら、フォーマット メソッドを呼び出して、文字列を返すリストの実際のインスタンスを渡すだけです。その文字列を出力できます。
それが役立つことを願っています。