当前位置: 首页 > 知识库问答 >
问题:

如何从TypeInfo获取声明和继承的成员

温举
2023-03-14

在新的反射API中,TypeInfo。声明的*属性是访问类型上声明的成员(字段、属性、方法等)的正确方法。但是,这些属性不包括从基类继承的成员。

旧的TypeInfo。GetRuntime*()方法返回声明的和继承的成员,但并非在所有平台上都可用,包括。净核心。

如何使用新API获取已声明和继承成员的列表?

共有1个答案

苏洛城
2023-03-14

我编写了一组提供此功能的小型扩展方法

public static class TypeInfoAllMemberExtensions
{
    public static IEnumerable<ConstructorInfo> GetAllConstructors(this TypeInfo typeInfo)
        => GetAll(typeInfo, ti => ti.DeclaredConstructors);

    public static IEnumerable<EventInfo> GetAllEvents(this TypeInfo typeInfo)
        => GetAll(typeInfo, ti => ti.DeclaredEvents);

    public static IEnumerable<FieldInfo> GetAllFields(this TypeInfo typeInfo)
        => GetAll(typeInfo, ti => ti.DeclaredFields);

    public static IEnumerable<MemberInfo> GetAllMembers(this TypeInfo typeInfo)
        => GetAll(typeInfo, ti => ti.DeclaredMembers);

    public static IEnumerable<MethodInfo> GetAllMethods(this TypeInfo typeInfo)
        => GetAll(typeInfo, ti => ti.DeclaredMethods);

    public static IEnumerable<TypeInfo> GetAllNestedTypes(this TypeInfo typeInfo)
        => GetAll(typeInfo, ti => ti.DeclaredNestedTypes);

    public static IEnumerable<PropertyInfo> GetAllProperties(this TypeInfo typeInfo)
        => GetAll(typeInfo, ti => ti.DeclaredProperties);

    private static IEnumerable<T> GetAll<T>(TypeInfo typeInfo, Func<TypeInfo, IEnumerable<T>> accessor)
    {
        while (typeInfo != null)
        {
            foreach (var t in accessor(typeInfo))
            {
                yield return t;
            }

            typeInfo = typeInfo.BaseType?.GetTypeInfo();
        }
    }
}

这应该是超级容易使用。调用typeInfo。例如,GetAllProperties(),将返回当前类型和任何基类型的所有DeclaredProperties,一直到继承树。

我在这里没有强加任何顺序,所以如果您需要以特定的顺序枚举成员,您可能需要调整逻辑。

一些简单的测试可以证明:

public class Test
{
    [Fact]
    public void Get_all_fields()
    {
        var fields = typeof(TestDerived).GetTypeInfo().GetAllFields();

        Assert.True(fields.Any(f => f.Name == "FooField"));
        Assert.True(fields.Any(f => f.Name == "BarField"));
    }

    [Fact]
    public void Get_all_properties()
    {
        var properties = typeof(TestDerived).GetTypeInfo().GetAllProperties();

        Assert.True(properties.Any(p => p.Name == "FooProp"));
        Assert.True(properties.Any(p => p.Name == "BarProp"));
    }
}

public class TestBase
{
    public string FooField;

    public int FooProp { get; set; }
}

public class TestDerived : TestBase
{
    public string BarField;

    public int BarProp { get; set; }
}

这些扩展方法与这两种桌面兼容。NET 4.5和。净核心。

 类似资料:
  • 见 映射类继承层次结构 对于这个部分。

  • 这是我的SDN 4实体: 这是输出: 我有一个密码查询: AFAIK(Neo4j SDN4实体继承和索引)这样Neo4j索引将不会被使用,因为我试图到达d节点上:决策标签。 在SDN 4中,是否有任何方法通过类继承来定义索引(将CreateDate留在BaseEntity级别),以便能够在

  • 我在Python 3.5中遇到了一个问题。我有一个类(B ),它继承了另一个类(A)。我试图只获取B中声明的方法,但它返回了B类中声明的方法,也从a类继承了方法。 这里的代码: 返回: 我想要: 如何修改get_methods来过滤继承的方法? 祝你今天愉快,谢谢。

  • 我在为继承另一个类属性的类定义构造函数时遇到困难 我在第 18 行(方面遇到了问题。 我收到的错误发生在我申报< code >运输的地点。 如代码所示,运输类是主体类,继承 这个错误发生在int 最后一个错误发生在两个字符串变量上。

  • 我对java.sql.Statement的方法getGeneratedKeys()有问题 首先我的代码: 创造sql:(HSQLDB) 从DAO创建方法: 然后,我对生成的密钥进行了单元测试: 当我运行测试时,我得到一个失败和以下日志: 所以问题是

  • 问题内容: 我有及其继承的类。如何从课程中获取属性? 举例来说,让这些和对象: 我想做一些事情,例如: 并得到。我怎样才能做到这一点? 问题答案: 你不能。 实例仅继承父类的方法和属性,而不继承 实例 属性。您不应混淆两者。 是 实例的实例 属性。本实例将有他们 自己 的副本属性。 通常,您将对构造函数进行编码以采用两个参数: 另一种方法是保留对实例的引用: 从那里不再继承。像这样使用它: