2013-06-02 4 views
10

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

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?

Спасибо!

+3

Есть ли конкретная причина, по которой вы объявили их «частными»? Является ли ваше намерение, что, как только они будут написаны, они не могут быть изменены? –

+0

Сделать общедоступной недвижимостью для них. удалите get & set, щелкните правой кнопкой мыши и сделайте refactor-> encapsulate field, и это сделает вас общедоступным get/set. В качестве альтернативы вы можете создать конструктор в миниатюре, чтобы установить эти элементы. Наконец, если вы хотите, чтобы элемент имел доступ к миниатюре, и у вас есть только эти 3 свойства, просто создайте структуру внутри элемента тремя вашими строками, а не отдельным классом для трех маленьких строк. просто мои 2 цента, удачи в вашем проекте! – Chris

ответ

10

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

  1. сделать свойство public вместо private.
  2. Используйте 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; } 
} 

с помощью отражения, чтобы получить и установить личные свойства

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

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). 

Simplify с вспомогательными методами

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

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"); 
+0

Большое спасибо! – RonaDona

+0

Бросьте «этот» infront свойства obj и измените методы на расширения. "public static T GetPrivateProperty (этот объект obj, string propertyName) {...}". Таким способом вы просто вызываете метод следующим образом: «test.GetPrivateProperty (« PrivateInt »); – Anders

0

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

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

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

Возможно, у вас также есть конструктор Item.

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 Get private property via Reflection

+0

Я думаю, что его проблема в том, что свойства миниатюр являются частными. –

+0

Ох ... хорошо поймать ... затем сделать их общедоступными. –

1

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

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

public class thumbnail 
{ 

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

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

0

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

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

public class thumbnail 
{ 
    public string url { get; set; } 
    public string width { get; set; } 
    public string height { get; set; } 
} 
Смежные вопросы