2010-08-02 35 views
28

我有这样的代码来遍历一个对象,并通过反射得到其所有属性:使用反射,我如何检测具有setter的属性。

foreach (var propertyInfo in typeof(TBase).GetProperties(BindingFlags.Public | BindingFlags.Instance)) 
{ 
    var oldValue = propertyInfo.GetValue(oldVersion, null); 
} 

我怎样才能做一个检查,只能看着那些一个对他们的“设置”属性? (我想忽略只读值 - 只是 “获取”)

+1

不要忘了与私有,保护,内部,或内部保护的制定者....那些麻烦制造者性能。 – 2010-08-02 20:10:51

+0

@ Dr.Wily'sApprentice您可否解释一下为什么这是必要的? (尤其是私人领域)我的意思是,由于反思,甚至有可能访问私人领域和属性? - Wohh ..看着它..这是可能的。我什么也没说。 – LuckyLikey 2015-05-12 12:27:53

回答

29

我最初的答案是不正确 - 请给予STO的回答道具:

propertyInfo.CanWritedocumentation

propertyInfo.GetSetMethoddocumentation

+0

这看起来对我来说是最干净的方法。 – mpenrow 2010-08-02 18:06:26

+2

我不相信你可以使用BindingFlags.SetProperty来查询具有setter的属性。当您想执行涉及实际设置属性的操作时(例如使用Type.InvokeMember方法),可以使用该标志。 – 2010-08-02 20:08:23

+13

这不起作用。使用下面STO提出的任何方法,并确保阅读Wily博士的学徒对他们之间差异的评论。 – JonathanK 2010-12-14 22:39:02

12
propertyInfo.GetSetMethod() != null 
71

PropertyInfo.CanWritedocumentation

PropertyInfo.GetSetMethoddocumentation

+0

这肯定会起作用,但您必须为每个房产做额外的检查。通过设置BindingFlags.SetProperty,您将只会检索包含setter的属性。 – 2010-08-02 18:02:46

+14

我会建议使用PropertyInfo.GetSetMethod并检查它是否为null; PropertyInfo.CanWrite方法将在属性中存在私有,受保护或内部集合时返回true。如果该属性中实际上没有setter,它将只返回false。 – 2010-08-02 20:06:22

+0

这个完美的作品。 – vtortola 2012-02-28 18:34:40

相关问题