如何检查是否公开
给定一个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子具有相同的能见度。