2010-09-21 4 views

ответ

89

Проверьте, что вы получите обратно от 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. 
} 

Примечание что если все, что вы хотите сделать, это установить свойство, пока оно имеет сеттер, вы не активируете y должен заботиться о том, является ли сеттер общедоступным. Вы можете просто использовать его, общественный или частные:

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

+1: Это лучше, чем 'GetSetMethod(). IsPublic' : он также работает, когда свойство имеет * no * setter. – Ani

+0

Спасибо @ Dan Tao. Это лучший ответ: upvoted! –

+0

Спасибо @ Dan Tao. :) –

9

Свойства .NET - действительно оболочка оболочки вокруг метода get и set.

Вы можете использовать метод GetSetMethod в PropertyInfo, возвращая MethodInfo, ссылаясь на установщик. Вы можете сделать то же самое с GetGetMethod.

Эти методы возвращают значение null, если геттер/сеттер не является общедоступным.

Правильный код здесь:

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

Вы должны использовать метод сошка для определения доступности, используя 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; 

Однако следует отметить, что добытчик & сеттер может иметь разные возможности доступа, например .:

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

Таким образом, вы не можете предположить, что геттер и сеттер будет иметь ту же видимость.

Смежные вопросы