2010-01-07 4 views
3

J'essaie de définir une valeur par réflexion. J'ai créé ce petit programme de testLa définition d'une valeur par réflexion ne fonctionne pas

struct headerIndexes 
    { 
     public int AccountNum{ get; set; } 
     public int other { get; set; } 
     public int items { get; set; } 
    } 
    static void Main(string[] args) 
    { 

     headerIndexes headers = new headerIndexes(); 
     headers.AccountNum = 1; 
     Console.WriteLine("Old val: {0}", headers.AccountNum); 
     foreach (var s in headers.GetType().GetProperties()) 
     { 
      if (s.Name == "AccountNum") 
       s.SetValue(headers, 99, null); 
     } 
     Console.WriteLine("New val: {0}", headers.AccountNum); 
     Console.ReadKey(); 
    } 

steping répercutant le programme que je vois qu'il fait correctement la commande s.SetValue(headers, 99, null); mais la valeur de headers.AccountNum reste à 1 lorsque setValue est exécuté.

Ai-je manqué une étape évidente?

+0

Les structures mutables sont mauvaises. http://blogs.msdn.com/ericlippert/archive/2008/05/14/mutating-readonly-structs.aspx –

Répondre

3

Je pense que les en-têtes peuvent être placés dans un nouvel objet car il s'agit d'une structure, puis l'objet récupère les ordures collectées dès que SetValue est renvoyé. Changez-le en classe et voyez si le problème disparaît.

+0

Ainsi, le fait de passer d'une structure à une classe a résolu le problème. –

1

SetValue attend un object qui provoque une opération de boxe sur headers. Comme headers est un struct, c'est un type de valeur. Par conséquent, une copie est faite et ce que vous modifiez est l'objet encadré et non headers.

Vous devriez sérieusement envisager d'éviter les types de valeur modifiables.

De Eric Lippert:

C'est encore une autre raison pour laquelle les types de valeur mutables sont mauvais. Essayez de toujours rendre les types de valeur immuables.

1

Vous pouvez également utiliser la version sans boîte de struct.
objet unboxedHeader = en-têtes;
s.SetValue (unboxedHeader, 99, null);

struct headerIndexes 
{ 
    public int AccountNum{ get; set; } 
    public int other { get; set; } 
    public int items { get; set; } 
} 
static void Main(string[] args) 
{ 

    headerIndexes headers = new headerIndexes(); 
    headers.AccountNum = 1; 
    Console.WriteLine("Old val: {0}", headers.AccountNum); 
    object unboxedHeader=headers; 
    foreach (var s in headers.GetType().GetProperties()) 
    { 
     if (s.Name == "AccountNum") 
      s.SetValue(unboxedHeader, 99, null); 
    } 
    Console.WriteLine("New val: {0}", headers.AccountNum); 
    Console.ReadKey(); 
} 
Questions connexes