Bruk refleksjon for å angi verdien av et felt i en struct som er en del av en oppstilling av structs

stemmer
3

I øyeblikket min kode setter verdien av felt / egenskaper / matriser av et objekt med refleksjon gitt en bane til feltet / eiendom fra roten objektet.

f.eks

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

Eksempelet ovenfor ville sette 'MyProperty' eiendom av 'MyObject' objekt 'nye verdien'

Jeg er ute av stand til å bruke refleksjonen for å angi en verdi av et felt i en struct som er en del av en oppstilling av structs fordi struct er et verditype (innen en matrise).

Her er noen test klasser / structs ...

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

Nedenfor er hvordan jeg lykkes sette verdien av normale eiendommer / felt og rekvisitter / felt i lister ...

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

Etter at jeg vil at myObject.myStructArray [0] .myField = '' min nye verdi og myObject.myOtherStructArray [1] .myOtherField = '' min nye verdi

Alt jeg trenger er en erstatning for den 'FieldInf.SetValue (foundObject, nyVerdi);' linje

takk på forhånd

Publisert på 20/03/2009 klokken 23:31
kilden bruker
På andre språk...                            


4 svar

stemmer
3

Få FieldInfo for matrisen objekt (ikke den spesifikke element).

Hvis det er en rekke, kastet den til en System.Array og bruke Array.SetValue å sette objektets verdi.

Svarte 21/03/2009 kl. 01:11
kilden bruker

stemmer
2

På grunn av boksing / unboxing, bør følgende gjøre akkurat hva du er ute etter, for alle typer struct medlem:

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;
Svarte 17/06/2011 kl. 16:04
kilden bruker

stemmer
1

Hvis jeg skulle gjette, er det feil i en del av koden du utelatt, spesielt jeg mistenker at:

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

er (utilsiktet) innstilling foundObjecttil en kopi av objektet ved den angitte listen stilling.

Svarte 20/03/2009 kl. 23:39
kilden bruker

stemmer
0

Mitt spørsmål fortsatte ...

Den eneste løsningen jeg fant på et lignende problem jeg hadde å sette et felt / eiendom i en struct som er et felt var å bruke ...

//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"); 

Problemet er hvordan kan jeg bruke SetValueDirect på en rekke / liste over structs, jeg gjetter min gamle metoden ovenfor vil ikke fungere når structs er i en rekke fordi jeg ikke kan få FieldInfo for struct (fordi dens i en array)?

Svarte 21/03/2009 kl. 00:08
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more