2013-06-02 15 views
10

HoCome posso accedere ad alcune proprietà (privati) di un oggetto?

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

e

public class thumbnail 
{ 

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

Se creo un oggetto di Item come questo

Item item = new Item(); 

Come posso accedere alle variabili url, width e height?

Grazie!

+3

C'è un motivo specifico per cui li dichiarati come 'private'? Il tuo intento è che una volta scritti non possano essere modificati? –

+0

Crea proprietà pubbliche per loro. rimuovere il get & set, fare clic destro e fare refactor-> incapsulare campo e ti farà un pubblico get/set .. In alternativa è possibile fare un costruttore in miniatura per impostare questi elementi. Infine, se vuoi che l'elemento abbia accesso alla miniatura e tu abbia solo quelle 3 proprietà, crea una struttura all'interno delle tre stringhe piuttosto che una classe separata per tre piccole stringhe. solo i miei 2 centesimi, buona fortuna per il tuo progetto! – Chris

risposta

10

Sono disponibili due opzioni:

  1. rendere la proprietà public invece di private.
  2. Usa reflection per accedere alle proprietà.

Si consiglia di utilizzare (1).

Si noti che è anche necessario inizializzare item.thumbnail:

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

Se bisogno che la proprietà thumbnail è sempre impostata, si potrebbe aggiungere un costruttore di classe Item come segue (dove ho anche tolto il setter per miniature e capitalizzato il nome della classe Thumbnail nomi di classe devono iniziare con una lettera maiuscola):.

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

utilizzando la riflessione per ottenere e impostare le proprietà private

Per utilizzare riflessione, ecco un esempio.Data una classe come questa:

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

È possibile impostare e ottenere la proprietà PrivateInt in questo modo:

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

Semplificare con metodi di supporto

Si potrebbe semplificare questo scrivendo un paio di metodi di supporto generici in questo modo:

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

Poi l'esempio con la classe Test sarebbe come questo:

Test test = new Test(); 

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

Grande grazie! – RonaDona

+0

Lanciare un "questo" davanti alla proprietà obj e cambiare i metodi in estensioni. "public static T GetPrivateProperty (questo oggetto obj, string propertyName) {...}". In questo modo è sufficiente chiamare il metodo in questo modo: "test.GetPrivateProperty (" PrivateInt ");" – Anders

0

È necessario impostare la miniatura di proprietà a un nuovo oggetto pure.

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

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

Si potrebbe anche impostare il costruttore dell'elemento.

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

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

È necessario rendere pubbliche o protette le proprietà o la classe di miniature. Si potrebbe anche usare interna, ma interno ha una portata molto limitata.

public class thumbnail 
{ 

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

Per accedere alle proprietà private della classe, è necessario utilizzare la riflessione. Vedere questo domanda SO per questo: .NET Get private property via Reflection

+0

Penso che il suo problema sia che le proprietà della miniatura sono private. –

+0

Oh .. buona presa ... quindi renderli pubblici. –

1

proprietà sono membri che forniscono un meccanismo flessibile per leggere, scrivere, o calcolare i valori dei campi privati ​​

Quindi penso che si dovrebbe dichiarare come loro pubblico

public class thumbnail 
{ 

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

Può essere possibile avere variabili di classe private e quindi è possibile accedervi tramite queste proprietà pubbliche.

0

Non è possibile accedervi perché sono proprietà private. Il modo in cui è possibile accedervi è accedervi internamente dal membro di thumbnail stesso.

Se si desidera che siano accessibili al di fuori della classe, creare i membri public.

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