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,因为我使用泛型和传递特性BaseClass进PrintProperties方法.
输出:
答:BaseClass
答:BaseClass
如何访问Child类的属性?我想要一个输出像:
答:BaseClass
Child1Name:Child1答:BaseClass
Child2Name:Child2
这里的问题是,你正在使用typeof(T)的PrintProperties,但T在你的例子是BaseClass,因为这是你给它从参数的类型SomeMethod.
在您的示例中,删除SomeMethod,PrintProperties直接调用该方法,它将工作.
一种更简单的方法是使用entity.GetType()而不是typeof(T).这样,无论泛型类型是什么,您都将获得对象的真实类型.
| 归档时间: |
|
| 查看次数: |
79 次 |
| 最近记录: |