当参数声明为基类型时,如何获取继承对象的属性?

Chr*_*ris 4 c# generics reflection

我有一个简单的程序,它使用反射打印出提供的类的属性和值.

class BaseClass
{
    public string A
    {
        get { return "BaseClass"; }
    }
}

class Child1 : BaseClass
{
    public string Child1Name {
        get { return "Child1"; }
    }
}

class Child2 : BaseClass
{
    public string Child2Name
    {
        get { return "Child2"; }
    }
}

class Program
{
    static void Main(string[] args)
    {
        var child1 = new Child1();
        var child2 = new Child2();
        SomeMethod(child1);
        SomeMethod(child2);

        Console.ReadKey();
    }

    static void SomeMethod(BaseClass baseClass)
    {
        PrintProperties(baseClass);
    }

    static void PrintProperties<T>(T entity)
    {
        var type = typeof(T);

        foreach (var targetPropInfo in type.GetProperties())
        {
            var value = type.GetProperty(targetPropInfo.Name).GetValue(entity);
            Console.WriteLine("{0}: {1}", targetPropInfo.Name, value);
        }
        Console.WriteLine("");
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是,它只能打印出BaseClass,因为我使用泛型和传递特性BaseClassPrintProperties方法.

输出:

答:BaseClass

答:BaseClass

如何访问Child类的属性?我想要一个输出像:

答:BaseClass
Child1Name:Child1

答:BaseClass
Child2Name:Child2

Sol*_*lli 6

这里的问题是,你正在使用typeof(T)PrintProperties,但T在你的例子是BaseClass,因为这是你给它从参数的类型SomeMethod.

在您的示例中,删除SomeMethod,PrintProperties直接调用该方法,它将工作.

一种更简单的方法是使用entity.GetType()而不是typeof(T).这样,无论泛型类型是什么,您都将获得对象的真实类型.