如何检查是否公开

给定一个PropertyInfo对象,如何检查该属性的setter是否公开?

检查GetSetMethod返回的GetSetMethod

 MethodInfo setMethod = propInfo.GetSetMethod(); if (setMethod == null) { // The setter doesn't exist or isn't public. } 

或者,对理查德的回答有一个不同的看法 :

 if (propInfo.CanWrite && propInfo.GetSetMethod(/*nonPublic*/ true).IsPublic) { // The setter exists and is public. } 

请注意,如果您只要设置了一个setter就可以设置一个属性,那么您实际上不必关心setter是否公开。 你可以使用它,公共私人:

 // 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 }); } 

.NET属性实际上是get和set方法的一个包装shell。

您可以使用PropertyInfo上的GetSetMethod方法,返回指向setter的MethodInfo。 你可以用GetGetMethod做同样的事情。

如果getter / setter是非公开的,这些方法将返回null。

这里正确的代码是:

 bool IsPublic = propertyInfo.GetSetMethod() != null; 
 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); } } } } 

您需要使用下划线方法来确定可访问性,使用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; 

但是,请注意,getter&setter可能具有不同的可访问性,例如:

 class Demo { public string Foo {/* public/* get; protected set; } } 

所以你不能假定吸气剂和二stream子具有相同的能见度。