2012-07-25 159 views
1

我在这里简单地提出了这个问题,因此该示例无法为真实世界做出任何贡献。无法通过反射获取泛型类型的属性

public class BusinessEntity<T> 
{ 
    public int Id {get; set;} 
} 

public class Customer : BusinessEntity<Customer> 
{ 

    public string FirstName { get; set;} 
    public string LastName { get; set;} 
} 

当我尝试通过反射获取Customer类属性时,无法获取泛型基类的属性。如何从BusinessEntity获取ID?

Type type = typeof(Customer); 

PropertyInfo[] properties = type.GetProperties(); 
// Just FirstName and LastName listed here. I also need Id here 
+1

刚刚测试过这种情况,我返回的属性数组总是有3项(VS2012,尝试多个目标框架)。 – Timbo 2012-07-25 07:58:56

+1

“如何从BusinessEntity获取Id?”去洗你的眼睛? :p – 2012-07-25 08:00:25

+2

这里有个诀窍:当你简化问题的代码时,*检查它是否仍然显示问题*。如果它没有**显示问题,那么看看真实代码和简化代码之间的区别,然后你自己回答*。 – 2012-07-25 08:03:10

回答

2

不,那肯定会返回所有3个属性。请检查您的实际代码,Id是否为internal/protected/etc(即非公开)。如果是,你需要在BindingFlags通过,例如:

PropertyInfo[] properties = type.GetProperties(
    BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); 

(默认设置为public +实例+静态)

还要检查它不是一个在实际代码;如果是:

public int Id; 

那么它是一个领域,你应该使用GetFields使Id属性,P

+0

其实它已被宣布为领域,因为你提到我的坏(:谢谢 – 2012-07-25 08:09:31

+0

+1,因为我从你上面的评论中学到了一些新的东西回答 – HatSoft 2012-07-25 08:16:02

1

为了让你将不得不使用基本属性该类型的BaseType属性

PropertyInfo[] baseProperties = typeof(Customer).BaseType.GetProperties(BindingFlags.DeclaredOnly); 
PropertyInfo[] properties = typeof(Customer).GetProperties(); 
+1

@Ryu请参阅更新答案以获取基类型属性 – HatSoft 2012-07-25 08:02:32

+0

事情是......这不是真的,默认情况下你会得到继承的属性,事实上,你必须将额外的标志传递给* not * get它们 – 2012-07-25 08:04:12

+0

@MarcGravell是的,我同意,但这是一种获得类型基础属性的方法 – HatSoft 2012-07-25 08:05:40

1

什么问题,您的代码是完全正确的,并返回co rrect性能

Type type = typeof(Customer); 
PropertyInfo[] properties = type.GetProperties(); 
foreach(var prop in properties) 
{ Console.WriteLine(prop) } 

结果

System.String FirstName 
System.String LastName 
Int32 Id