Вот метод расширения до System.Type
, который ответит на этот и подобные вопросы о наследовании:
public static class TypeExtensions
{
public static bool InheritsFrom(this Type t, Type baseType)
{
if (t.BaseType == null)
{
return false;
}
else if (t == baseType)
{
return true;
}
else if (t.BaseType.IsGenericType && t.BaseType.GetGenericTypeDefinition().InheritsFrom(baseType))
{
return true;
}
else if (t.BaseType.InheritsFrom(baseType))
{
return true;
}
return false;
}
public static bool InheritsFrom<TBaseType>(this Type t)
=> t.InheritsFrom(typeof(TBaseType));
}
Вы бы использовали его так:
public static barChecker<T> Generator()
{
var rtn = new barChecker<T>();
foreach (var item in typeof(T).GetProperties())
{
if (item.PropertyType.InheritsFrom(typeof(foo<>)))
{
rtn.fooprops.Add(item);
}
}
return rtn;
}
Или сделайте этоуниверсальный и параметризованный foo<>
:
public static barChecker<T> Generator2<TInheritsFrom>()
=> new barChecker<T> {
fooprops = typeof(T).GetProperties()
.Where(pi => pi.PropertyType.InheritsFrom<TInheritsFrom>())
.ToList()
};
И используйте это так:
var barchkr = barChecker<SomeClass>.Generate<foo<>>();