c# Get if 属性 type inherits from one abstract generic class with reflection 获取
c# Get if property type inherits from one abstract generic class with reflection
我想获取 class 中包含的所有属性,其类型继承自某个抽象和泛型 class。
public abstract class foo<T> { }
public class fooInt_Indexed : foo<int> { }
public class fooInt_Not_Indexed : foo<int> { }
public class fooString_Compressed : foo<string> { }
public class fooString_Indexed : foo<string> { }
public class fooFloat : foo<float> { }
public abstract class bar
{
}
public class foobar : bar
{
public fooInt_Indexed value { get; set; }
public fooInt_Not_Indexed someOtherValue { get; set; }
public fooFloat someFloat { get; set; }
public otherData<int> {get; set; }
}
public class barChecker<T> where T : bar
{
public List<PropertyInfo> fooprops = new List<PropertyInfo>();
public static barChecker<T> Generator()
{
var @new = new barChecker<T>();
foreach (var item in typeof(T).GetProperties())
{
if (item.PropertyType is somesortof(foo<>)) @new.fooprops.Add(item);
}
return @new;
}
我需要在 barChecker<T>
class 代码中放入什么才能使其 fooprops 列表包含 "value"、"someOtherValue" 和 属性 信息"someFloat" 当生成为 barChecker<foobar>
?
这里是:
item.PropertyType is somesortof(foo<>)
必须替换为
typeof(YourType).IsAssignableFrom(item.PropertyType)
'is' 运算符仅适用于真实的对象实例,如果您已经有类型引用则不行。
那么在你的例子中 'YourType' 是 typeof(barchecker< foobar >) 吗?
这是 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));
}
我想获取 class 中包含的所有属性,其类型继承自某个抽象和泛型 class。
public abstract class foo<T> { }
public class fooInt_Indexed : foo<int> { }
public class fooInt_Not_Indexed : foo<int> { }
public class fooString_Compressed : foo<string> { }
public class fooString_Indexed : foo<string> { }
public class fooFloat : foo<float> { }
public abstract class bar
{
}
public class foobar : bar
{
public fooInt_Indexed value { get; set; }
public fooInt_Not_Indexed someOtherValue { get; set; }
public fooFloat someFloat { get; set; }
public otherData<int> {get; set; }
}
public class barChecker<T> where T : bar
{
public List<PropertyInfo> fooprops = new List<PropertyInfo>();
public static barChecker<T> Generator()
{
var @new = new barChecker<T>();
foreach (var item in typeof(T).GetProperties())
{
if (item.PropertyType is somesortof(foo<>)) @new.fooprops.Add(item);
}
return @new;
}
我需要在 barChecker<T>
class 代码中放入什么才能使其 fooprops 列表包含 "value"、"someOtherValue" 和 属性 信息"someFloat" 当生成为 barChecker<foobar>
?
这里是:
item.PropertyType is somesortof(foo<>)
必须替换为
typeof(YourType).IsAssignableFrom(item.PropertyType)
'is' 运算符仅适用于真实的对象实例,如果您已经有类型引用则不行。
那么在你的例子中 'YourType' 是 typeof(barchecker< foobar >) 吗?
这是 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));
}