Внутренний сеттер класса С# и PropertyGrid

У меня есть приложение Winform, и в форме есть PropertyGrid. Класс Person имеет свойство (Age) с внутренним сеттером. Почему это свойство доступно только для чтения в PropertyGrid? Логически PropertyGrid является членом той же сборки, и внутренние элементы доступны для членов сборки.

public class Person
{
    public string Name { get; set; }

    internal int Bio { get; set; }

    private int age;
    public int Age
    {
        get { return age; }
        internal set { age = value; }
    }

    public string Location { get; internal set; }
}

Спасибо.


person Tim    schedule 08.04.2017    source источник


Ответы (1)


ProperyGrid находится в собственной сборке (System.Windows.Forms.dll), отдельной от вашей сборки.

Следовательно, у него нет доступа к свойствам, методам или полям, которые определены как внутренние в вашей сборке.

Простая ссылка на Person и PropertyGrid из той же сборки, где определен Person, не сделает установщик Age видимым в System.Windows.Forms.dll

Кроме того, PropertyGrid, скорее всего, использует отражение, подобное этому:

object obj = this.SelectedObject;
Type type = obj.GetType();
PropertyInfo[] props = type.GetProperties(BindingFlags.Public | BindingFlags.Instance);

foreach(PropertyInfo pInfo in props)
{
    if (pInfo.CanWrite)
    { 
           // mark as read/write
    }
    else
    {
         // mark as read-only
    }
}

Получение только public свойств. Свойство Age будет возвращено, но помечено CanWrite == false

person Jens Meinecke    schedule 10.04.2017
comment
Итак, вы имеете в виду, что нет никакого обходного пути для этого? Спасибо. - person Tim; 10.04.2017