Eri*_*sen 21 .net c# reflection inheritance
在派生类中声明与基类中的属性名称匹配的属性"隐藏"它(除非它使用override关键字覆盖它).Type.GetProperties()如果它们的类型不匹配,则返回基类和派生类属性.但是,如果它们的类型不匹配,令人震惊的是仅返回派生类的属性.例如:
class A
{
protected double p;
public int P { get { return (int)p; } set { p = value; } }
}
class B : A
{
public new int P { get { return (int)p; } set { p = value; } }
}
class C : B
{
public new float P { get { return (float)p; } set { p = value; } }
}
Run Code Online (Sandbox Code Playgroud)
呼叫typeof(C).GetProperties()只会返回BP和CP是否可以以GetProperties()返回所有三种方式调用?几乎可以肯定,通过遍历继承层次结构可以实现这一目标,但是有更清洁的解决方案吗?
GetProperties定义为该类型的所有公共属性.
您可以使用以下方法获取get和set方法:
typeof(C).GetMethods()
.Where(m => m.Name.StartsWith("set_") || m.Name.StartsWith("get_"))
Run Code Online (Sandbox Code Playgroud)
虽然这似乎是一个坏主意,相比之下,继承层次结构获取属性.
我不认为没有遍历继承层次结构是可能的.但它不必太多代码,但是:
public static IEnumerable<PropertyInfo> GetAllProperties(Type t)
{
while (t != typeof(object))
{
foreach (var prop in t.GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance))
yield return prop;
t = t.BaseType;
}
}
Run Code Online (Sandbox Code Playgroud)
当然,如果你知道一个共同的基本类型,你可以停止,而不是对象,它将更有效.也; 这需要一些时间来进行反射,因此缓存结果.毕竟,类型信息在执行期间不会改变.
| 归档时间: |
|
| 查看次数: |
5584 次 |
| 最近记录: |