2013-06-02 12 views
10

mamJak mogę uzyskać dostęp do niektórych (prywatnych) właściwości obiektu?

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

i

public class thumbnail 
{ 

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

Gdybym utworzyć obiekt Item jak ten

Item item = new Item(); 

Jak mogę uzyskać dostęp do zmiennych url, width i height?

Dzięki!

+3

Czy istnieje określony powód, dla którego zadeklarowałeś je jako "prywatne"? Czy masz zamiar, aby po ich napisaniu nie można było zmienić? –

+0

Utwórz dla nich właściwości publiczne. usuń get & set, kliknij prawym przyciskiem myszy i wykonaj refactor-> encapsulate field, a to sprawi, że będziesz publicznie otrzymywać/ustawiać. Alternatywnie możesz stworzyć konstruktora w miniaturze, aby ustawić te elementy. Na koniec, jeśli chcesz tylko, aby element miał dostęp do miniatury i masz tylko te 3 właściwości, po prostu utwórz strukturę wewnątrz elementu z trzema ciągami, zamiast oddzielnej klasy dla trzech małych ciągów. tylko moje 2 centy, powodzenia w twoim projekcie! – Chris

Odpowiedz

10

Masz dwie opcje:

  1. podjęciu właściwości public zamiast private.
  2. Użyj reflection, aby uzyskać dostęp do właściwości.

Polecam używanie (1).

Należy pamiętać, że trzeba także zainicjować item.thumbnail:

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

Jeśli wymagają że nieruchomość thumbnail jest zawsze ustawiony, można dodać konstruktora klasy Item następująco (gdzie mam również usunięte seter na miniaturze, kapitalizowane nazwę klasy Thumbnail nazwy klas powinny rozpocząć się wielką literą).

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; } 
} 

użyciu odbicia do pobierania i ustawiania prywatnych właściwości

użyć refleksji, oto przykład.Biorąc pod uwagę klasę tak:

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

Można ustawić i uzyskać jego PrivateInt właściwość tak:

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

Uproszczenie z metod pomocniczych

Można by uprościć to przez pisanie kilka ogólnych metod pomocniczych, takich jak:

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); 
} 

Wtedy przykład z klasą Test byłoby tak:

Test test = new Test(); 

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

Wielkie dzięki! – RonaDona

+0

Wrzuć "ten" infront do właściwości obj i zmień metody na rozszerzenia. "publiczny statyczny T GetPrivateProperty (ten obiekt obj, nazwa właściwości łańcucha) {...}". W ten sposób po prostu wywołaj metodę w następujący sposób: "test.GetPrivateProperty (" PrivateInt ");" – Anders

0

Należy również ustawić miniaturę właściwości na nowy obiekt.

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

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

Można również ustawić konstruktora elementu.

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

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

Powinieneś uczynić właściwości lub klasę miniatur jako publiczne lub chronione. Można również użyć wewnętrznego, ale wewnętrzny ma bardzo ograniczony zakres.

public class thumbnail 
{ 

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

Aby uzyskać dostęp do prywatnych właściwości klasy, należy użyć odbicia. Zobacz ten SO pytanie o to: .NET Get private property via Reflection

+0

Myślę, że jego problemem jest to, że właściwości miniaturek są prywatne. –

+0

Och ... dobry połów ... a następnie udostępnij je publicznie. –

1

Właściwości są członkami, które zapewniają elastyczny mechanizm do odczytu, zapisu lub obliczyć wartości prywatnych pól

Więc myślę, że powinieneś oznaczyć je jako publiczne

public class thumbnail 
{ 

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

Możliwe, że możesz mieć prywatne zmienne klasy, a następnie możesz uzyskać do nich dostęp za pośrednictwem tych właściwości publicznych.

0

Nie można uzyskać do nich dostępu, ponieważ są to prywatne nieruchomości. Sposób, w jaki można uzyskać do niego dostęp, polega na uzyskaniu dostępu do nich wewnętrznie przez członka samej sieci thumbnail.

Jeśli chcesz, aby były dostępne poza klasą, ustaw członków na public.

public class thumbnail 
{ 
    public string url { get; set; } 
    public string width { get; set; } 
    public string height { get; set; } 
} 
Powiązane problemy