Как я могу получить доступ к некоторым (частным) свойствам объекта?

У меня

public class Item
{
    public string description { get; set; }
    public string item_uri { get; set; }
    public thumbnail thumbnail { get; set; }
}

и

public class thumbnail 
{

 private string url { get; set; }
 private string width { get; set; }
 private string height { get; set; }
}

Если я создаю объект Item, как этот

 Item item = new Item ();

Как получить доступ к переменным url, width и height?

Спасибо!

Ответ 1

У вас есть два варианта:

  • Создайте свойства public вместо private.
  • Используйте reflection для доступа к свойствам.

Я рекомендую использовать (1).

Обратите внимание, что вам также нужно инициализировать item.thumbnail:

Item item = new Item ();
item.thumbnail = new thumbnail();

Если вам требуется, чтобы свойство thumbnail всегда было установлено, вы можете добавить конструктор в класс Item следующим образом (где я также удалил установщик для миниатюры и запустил имя класса thumbnail. Класс имена должны начинаться с заглавной буквы):

public class Item
{
    public Item(Thumbnail thumbnail)
    {
        if (thumbnail == null)
            throw new ArgumentNullException("thumbnail");

        this.thumbnail = thumbnail;
    }

    public string description { get; set; }
    public string item_uri { get; set; }
    public thumbnail thumbnail { get; }
}

Использование Reflection для получения и установки частных свойств

Чтобы использовать отражение, вот пример. Учитывая класс, подобный этому:

public class Test
{
    private int PrivateInt
    {
        get;
        set;
    }
}

Вы можете установить и получить свойство PrivateInt следующим образом:

Test test = new Test();
var privateInt = test.GetType().GetProperty("PrivateInt", BindingFlags.Instance | BindingFlags.NonPublic);

privateInt.SetValue(test, 42); // Set the property.

int value = (int) privateInt.GetValue(test); // Get the property (will be 42).

Упростить с помощью вспомогательных методов

Это можно упростить, написав пару общих вспомогательных методов, например:

public static T GetPrivateProperty<T>(object obj, string propertyName)
{
    return (T) obj.GetType()
                  .GetProperty(propertyName, BindingFlags.Instance | BindingFlags.NonPublic)
                  .GetValue(obj);
}

public static void SetPrivateProperty<T>(object obj, string propertyName, T value)
{
    obj.GetType()
       .GetProperty(propertyName, BindingFlags.Instance | BindingFlags.NonPublic)
       .SetValue(obj, value);
}

Тогда пример с классом Test будет таким:

Test test = new Test();

SetPrivateProperty(test, "PrivateInt", 42);
int value = GetPrivateProperty<int>(test, "PrivateInt");

Ответ 2

Свойства - это члены, которые предоставляют гибкий механизм для чтения, записи или вычисления значений частных полей

Итак, я думаю, вы должны объявить их публичными

public class thumbnail 
{

 public string url { get; set; }
 public string width { get; set; }
 public string height { get; set; }
}

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

Ответ 3

Вам также нужно установить миниатюру свойств для нового объекта.

Item item = new Item ();
item.thumbnail = new thumbnail();

item.thumbnail.url = "http://www.microsoft.com";

У вас также может быть конструктор элемента, задающего его.

public class Item
{
    public Item()
    {
        thumbnail = new thumbnail();
    }

    public string description { get; set; }
    public string item_uri { get; set; }
    public thumbnail thumbnail { get; set; }
}

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

public class thumbnail 
{

 protected string url { get; set; }
 protected string width { get; set; }
 protected string height { get; set; }
}

Чтобы получить доступ к приватным свойствам класса, вам нужно будет использовать отражение. См. Этот вопрос SO для этого: .NET Получить частную собственность через Reflection

Ответ 4

Вы не можете получить к ним доступ, потому что это частные свойства. Способ, которым вы можете получить доступ к нему, - это доступ к ним изнутри самим членом thumbnail.

Если вы хотите, чтобы к ним обращались вне класса, создайте члены public.

public class thumbnail 
{
   public string url { get; set; }
   public string width { get; set; }
   public string height { get; set; }
}