Ответ 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");