public abstract class FooBase
public abstract class Foo<T> : FooBase
public Type ValueType { get { return typeof(T); } }
public abstract T Value { get; set; }
public class DoubleFoo : Foo<double>
public override double Value { get; set; }
public DoubleFoo doubleFoo1 { get; set; }
public Foo<double> doubleFoo2 { get; set; }
public static void Main()
var properties = typeof(FooHandler).GetProperties();
Console.WriteLine(properties[0].PropertyType);
Console.WriteLine(properties[0].PropertyType.BaseType);
Console.WriteLine(properties[0].PropertyType.BaseType.BaseType);
Console.WriteLine(properties[1].PropertyType);
Console.WriteLine(properties[1].PropertyType.BaseType);