Как узнать, есть ли у свойства класса публичный набор (.NET)? - PullRequest
6 голосов
/ 09 октября 2008

У меня есть это:

public string Log
        {
            get { return log; }
            protected set
            {
                if (log != value)
                {
                    MarkModified(PropertyNames.Log, log);
                    log = value;
                }
            }

        }

А мой служебный класс для привязки данных делает это:

PropertyInfo pi = ReflectionHelper.GetPropertyInfo(boundObjectType, sourceProperty);

if (!pi.CanWrite)
                SetReadOnlyCharacteristics(boundEditor);

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

Как определить, существует ли публичный набор, а не просто любой набор?

Ответы [ 5 ]

2 голосов
/ 09 октября 2008

Вам необходимо использовать BindingFlags . Что-то вроде

PropertyInfo property = type.GetProperty("MyProperty", BindingFlags.Public | BindingFlags.SetProperty | BindingFlags.Instance);
1 голос
/ 09 октября 2008

Альтернативой предлагаемым изменениям ReflectionHelper в других ответах является вызов pi.GetSetMethod(false) и проверка, является ли результат нулевым.

1 голос
/ 09 октября 2008

Вызовите GetSetMethod для PropertyInfo, получите MethodInfo и проверьте его свойства, например IsPublic.

0 голосов
/ 09 октября 2008

Ну, это немного сложно сказать, так как у вас есть класс "ReflectionHelper", где мы не можем видеть источник. Однако мое первое предположение состоит в том, что вы неправильно устанавливаете атрибут BindingFlags при вызове Type.GetProperty. Вам необходимо OR в флаге перечисления Public, чтобы гарантировать, что возвращаются только общедоступные значения.

0 голосов
/ 09 октября 2008

Внутри вашего ReflectionHelper.GetPropertyInfo () вы, вероятно, связаны с boundObjectType.GetType (). GetProperties (), где параметр BindingFlags, очевидно, включает в себя BindingFlags.NonPublic. Вы хотите указать только BindingFlags.Public

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