2015-10-28 6 views
6

Ho cercato di sperimentare con la riflessione e ho una domanda.C# 6.0 e riflessione, ottenendo il valore degli inizializzatori di proprietà

Diciamo che ho una classe, e in questa classe ho un immobile initilized con la nuova funzione di C# 6,0

Class MyClass() 
{ 
    public string SomeProperty{ get; set; } = "SomeValue"; 
} 

non v'è alcun modo di ottenere questo valore, con la riflessione, senza initilizating classe ?

So che potrei fare questo;

var foo= new MyClass(); 
var value = foo.GetType().GetProperty("SomeProperty").GetValue(foo); 

Ma quello che voglio fare è qualcosa di simile a questo;

typeof(MyClass).GetProperty("SomeProperty").GetValue(); 

So che potrei usare un campo per ottenere il valore. Ma deve essere una proprietà.

Grazie.

+0

AFAIK Non è possibile ottenere il valore a meno che la classe sia istanziata e allocata memoria e i relativi campi siano inizializzati. Come controllo incrociato a questa maggior parte dei metodi di riflessione così noti si ha un'istanza/oggetto come parametro. –

+0

Penso che non si possa fare, poiché la proprietà e la classe non sono statiche. Per accedere alla proprietà è necessario disporre di un oggetto valido disponibile (con riferimento in memoria). –

+0

Come dice la risposta, a meno che l'oggetto di classe non sia inizializzato, non ci sono oggetti stringa in memoria che memorizzano il valore ad esso assegnato. Dovrai creare un'istanza per ottenere l'oggetto stringa e il valore ad esso assegnato. – danish

risposta

5

È solo uno zucchero sintassi. Questo :

class MyClass() 
{ 
    public string SomeProperty{ get; set; } = "SomeValue"; 
} 

sarà scartato dal compilatore in questo:

class MyClass() 
{ 
    public MyClass() 
    { 
     _someProperty = "SomeValue"; 
    } 

    // actually, backing field name will be different, 
    // but it doesn't matter for this question 
    private string _someProperty; 

    public string SomeProperty 
    { 
     get { return _someProperty; } 
     set { _someProperty = value; } 
    } 
} 

riflessione è circa metadati. Non ci sono "SomeValue" memorizzati in metatada. Tutto quello che puoi fare è leggere il valore della proprietà in modo regolare.

So che avrei potuto utilizzare un campo per ottenere il valore

Senza istanziare un oggetto, è possibile ottenere valori di soli campi statici.
Per ottenere i valori dei campi di istanza, è ovviamente necessario disporre di un'istanza di oggetto.

+0

Oh, capisco. Grazie. – Rudithus

1

In alternativa, se è necessario il valore predefinito della proprietà nei metadati di riflessione, è possibile utilizzare Attributi, uno dei quali da System.ComponentModel, eseguire il lavoro: DefaultValue. Ad esempio:

using System.ComponentModel; 

class MyClass() 
{ 
    [DefaultValue("SomeValue")] 
    public string SomeProperty{ get; set; } = "SomeValue"; 
} 
// 
var propertyInfo = typeof(MyClass).GetProperty("SomeProperty"); 
var defaultValue = (DefaultValue)Attribute.GetCustomeAttribute(propertyInfo, typeof(DefaultValue)); 
var value = defaultValue.Value;