2009-03-20 8 views
3

Actuellement, mon code définit avec succès la valeur des champs/propriétés/tableaux d'un objet en utilisant la réflexion donnée au chemin/propriété de l'objet racine.Utilisez la réflexion pour définir la valeur d'un champ dans une structure qui fait partie d'un tableau de structures

par exemple.

//MyObject.MySubProperty.MyProperty 
SetValue('MySubProperty/MyProperty', 'new value', MyObject); 

L'exemple ci-dessus définir la propriété « MyProperty » de l'objet « MyObject » à « nouvelle valeur »

Je ne peux pas utiliser la réflexion pour définir une valeur d'un champ dans une structure qui est partie d'un tableau de structs car la structure est un type de valeur (dans un tableau).

Voici quelques classes de test/struct ...

public class MyClass { 
     public MyStruct[] myStructArray = new MyStruct[] { 
      new MyStruct() { myField = "change my value" } 
     }; 
     public MyStruct[] myOtherStructArray = new MyStruct[] { 
      new MyStruct() { myOtherField = "change my value" }, 
      new MyStruct() { myOtherField = "change my other value" } 
     }; 
} 

public struct MyStruct { public string myField; public string myOtherField; } 

est ci-dessous comment je réussi à mettre la valeur des propriétés normales/champs et accessoires/champs dans les listes ...

public void SetValue(string pathToData, object newValue, object rootObject) 
{ 
    object foundObject = rootObject; 
    foreach (string element in pathToData.Split("/")) 
    { 
     foundObject = //If element is [Blah] then get the 
         //object at the specified list position 
     //OR 
     foundObject = //Else get the field/property 
    } 

    //Once found, set the value (this is the bit that doesn't work for 
    //       fields/properties in structs in arrays) 
    FieldInf.SetValue(foundObject, newValue); 
} 

object myObject = new MyClass(); 
SetValue("/myStructArray/[0]/myField", "my new value", myObject); 
SetValue("/myOtherStructArray/[1]/myOtherField", "my new value", myObject); 

après que je veux que le myObject.myStructArray [0] .myField = '' ma nouvelle valeur "et myObject.myOtherStructArray [1] .myOtherField = '' ma nouvelle valeur"

Tout ce que je nee d est un remplacement de 'FieldInf.SetValue (foundObject, newValue);' ligne

merci à l'avance

Répondre

3

Obtient le FieldInfo pour l'objet tableau (pas l'élément spécifique).

S'il s'agit d'un tableau, convertissez-le en System.Array et utilisez Array.SetValue pour définir la valeur de l'objet.

+0

votre réponse, je ne pense pas que cela fonctionnera car la structure est la suivante ... MyObject.myStructArray [0] .myField Donc en utilisant votre méthode Array.SetValue – Mark

+0

...Je voudrais passer dans une nouvelle structure, J'essaie de définir la valeur d'un champ dans une structure thats dans un tableau – Mark

+1

Oui. Chaque fois que vous avez un tableau de structures, c'est la meilleure approche. Vous pouvez le copier dans une nouvelle structure locale, et seulement écraser ce membre, puis le renvoyer. –

1

Si je devais deviner, le bug est dans une partie du code que vous omettez, plus précisément je pense que:

foundObject = //If element is [Blah] then get the 
        //object at the specified list position 

est (involontairement) la mise à foundObjectCopie de l'objet à la position de liste spécifiée.

+0

Salut thans pour répondre, s'il vous plaît voir mes commentaires ci-dessous ... Merci pour – Mark

0

Ma question a continué ...

La seule solution que j'ai trouvé à un problème similaire j'avais mise un champ/propriété dans un struct qui est un champ était d'utiliser ...

//GrandParentObject is myObject 
//GrandParentType is typeof(MyClass) 
//FieldIWantedToSet is the field info of myStruct.FieldIWantedToSet 
FieldInfo oFieldValueTypeInfo = GrandParentType.GetField("myStruct"); 
TypedReference typedRefToValueType = TypedReference.MakeTypedReference(GrandParentObject, new FieldInfo[] { oFieldValueTypeInfo }); 
FieldIWantedToSet.SetValueDirect(typedRefToValueType, "my new value"); 

Le problème est comment puis-je utiliser SetValueDirect sur un tableau/liste de structures, je devine que mon ancienne méthode ci-dessus ne fonctionnera pas quand les structures sont dans un tableau parce que je ne peux pas obtenir le FieldInfo pour le struct?

2

En raison de la boxe/unboxing, ce qui suit devrait faire exactement ce que vous cherchez, pour tout type de membre struct:

var property = this.GetType().GetProperty(myPropertyName, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public); 
ValueType vthis = this; 
property.SetValue(vthis, myValue, null); // myValue is the value/object to be assigned to the property. 
this = (UnderlyingsList)vthis;