Как проверить, является ли установщик свойства публичным - PullRequest
53 голосов
/ 21 сентября 2010

Учитывая объект PropertyInfo, как я могу проверить, что установщик свойства является общедоступным?

Ответы [ 4 ]

108 голосов
/ 21 сентября 2010

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

Обратите внимание, что если все, что вы хотите сделать, это установить свойство, если оно имеет установщик, вам на самом деле не нужно заботиться о том, является ли установщик общедоступным.Вы можете просто использовать его, общедоступный или 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 });
}
9 голосов
/ 21 сентября 2010

.NET-свойства действительно являются оболочкой для метода get и set.

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

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

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

bool IsPublic = propertyInfo.GetSetMethod() != null;
4 голосов
/ 21 сентября 2010
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);
            }
        }
    }
}
1 голос
/ 21 сентября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...