给定PropertyInfo对象,我该如何检查属性的setter是否公开?
答案 0 :(得分:106)
检查从GetSetMethod
获取的内容:
MethodInfo setMethod = propInfo.GetSetMethod();
if (setMethod == null)
{
// The setter doesn't exist or isn't public.
}
或者,对Richard's answer进行不同的调整:
if (propInfo.CanWrite && propInfo.GetSetMethod(/*nonPublic*/ true).IsPublic)
{
// The setter exists and is public.
}
请注意,如果你想要做的就是设置一个属性,只要它有一个setter,你实际上不必关心setter是否是公共的。你可以使用它,public 或 private:
// This will give you the setter, whatever its accessibility,
// assuming it exists.
MethodInfo setter = propInfo.GetSetMethod(/*nonPublic*/ true);
if (setter != null)
{
// Just be aware that you're kind of being sneaky here.
setter.Invoke(target, new object[] { value });
}
答案 1 :(得分:9)
.NET属性实际上是围绕get和set方法的包装shell。
您可以在PropertyInfo上使用GetSetMethod
方法,返回引用setter的MethodInfo。您可以使用GetGetMethod
执行相同的操作。
如果getter / setter是非公共的,这些方法将返回null。
这里的正确代码是:
bool IsPublic = propertyInfo.GetSetMethod() != null;
答案 2 :(得分:4)
public class Program
{
class Foo
{
public string Bar { get; private set; }
}
static void Main(string[] args)
{
var prop = typeof(Foo).GetProperty("Bar");
if (prop != null)
{
// The property exists
var setter = prop.GetSetMethod(true);
if (setter != null)
{
// There's a setter
Console.WriteLine(setter.IsPublic);
}
}
}
}
答案 3 :(得分:1)
您需要使用基础方法来使用PropertyInfo.GetGetMethod()或PropertyInfo.GetSetMethod()来确定辅助功能。
// Get a PropertyInfo instance...
var info = typeof(string).GetProperty ("Length");
// Then use the get method or the set method to determine accessibility
var isPublic = (info.GetGetMethod(true) ?? info.GetSetMethod(true)).IsPublic;
然而,请注意,吸气剂和吸气剂是setter可能具有不同的可访问性,例如:
class Demo {
public string Foo {/* public/* get; protected set; }
}
所以你不能假设getter和setter具有相同的可见性。