使用反射,如何检测具有setter的属性?

58

我有这段代码用于通过反射循环遍历一个对象并获取其所有属性:

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

我该如何进行检查,只查看具有“Set”属性的属性?(我想忽略只读值 - 只有“Get”。)


2
不要忘记具有私有、受保护、内部或内部受保护设置器的属性...它们是麻烦制造者。 - Dr. Wily's Apprentice
@Dr.Wily'sApprentice,你能解释一下这为什么是必要的吗?(特别是私有的)我的意思是说,由于反射,访问私有域和属性是否真的可能?- 哇..我查了一下..原来是可以的。我什么也没说。 - LuckyLikey
2个回答

124

PropertyInfo.CanWrite (文档)

PropertyInfo.GetSetMethod (文档)


2
这肯定会起作用,但你需要为每个属性进行额外的检查。通过设置BindingFlags.SetProperty,您只会检索包含setter的属性。 - Wallace Breza
26
我建议使用PropertyInfo.GetSetMethod并检查它是否为空;如果属性上有私有、受保护或内部的set,则PropertyInfo.CanWrite方法会返回true。只有当属性实际上没有setter时,它才会返回false。 - Dr. Wily's Apprentice

25
propertyInfo.GetSetMethod() != null

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接