私が次を持っているとしましょう:
public class MyContainer
{
public string ContainerName { get; set; }
public IList<Square> MySquares { get; set; }
public IList<Circle> MyCircles { get; set; }
public MyContainer()
{
MySquares = new List<Square>();
MyCircles = new List<Circle>();
}
}
public class Shape
{
public int Area { get; set; }
}
public class Square : Shape
{
}
public class Circle : Shape
{
}
そして今、私はそのような関数を持っています:
private static void Collect(MyContainer container)
{
var properties = container.GetType().GetProperties();
foreach (var property in properties)
{
if (property.PropertyType.IsGenericType &&
property.PropertyType.GetGenericTypeDefinition() == typeof(IList<>) &&
typeof(Shape).IsAssignableFrom(property.PropertyType.GetGenericArguments()[0]))
{
var t = property.GetValue(container, null) as List<Square>;
if (t != null)
{
foreach (Shape shape in t)
{
Console.WriteLine(shape.Area);
}
}
}
}
これは、MySquares
プロパティに到達したときに希望どおりに機能しますが、代わりに次の方法でキャストしたいと考えていました。
var t = property.GetValue(container, null) as List<Shape>;
同様のリストを持つMyContainerのすべてのプロパティを循環することを期待していました。私はこれを行うことができますか?