Kan jeg bruke refleksjon og en streng for å få / stille inn riktig egenskap ved et objekt?

stemmer
0

Jeg bruker C # og .NET 3.5. En leverandør gir oss et objekt som har egenskapene til UserVarNbr1, UserVarData1, UserVarNbr2, UserVarData2 ... UserVarNbrN, UserVarDataN. Ikke slik jeg ville ha kodet det, men likevel, dette er hva vi har å jobbe med. Et annet mål i programmet returnerer en samling av elementer som brukes til å representere disse UserVariables.

Samlingen elementer har egenskaper som dette

public string VariableName
{
  get { return _VariableName; }
  set { _VariableName = value; }
}


public string VariableData
{
  get { return _VariableData; }
  set { _VariableData = value; }
}

Jeg trenger å sløyfe gjennom innsamling og opprette en forekomst av leverandøren gjenstanden og stille inn de riktige egenskaper. UserVarNbrN må UserVarDataN å bli satt på riktig sted. Merk samlingen returnerer en variabel som en streng 03, dette må kjøre VendorObject egenskaper UserVarNbr3, UserVarData3 ** merker ingen 0 i den aktuelle eiendommen navn. Hvordan kan jeg referere riktig eiendommen for å få / sett?

var o = new VendorObj();

Jeg har noe sånt som dette så langt.

foreach (var item in userVars)
        {
            const string propPrefix = UserVar;
            int varNum;
            var isNum = int.TryParse(item.VariableName, out varNum);

            if(isNum)
            {
                PropertyInfo pi;
                //this is where I am stuck
                // I need to set the corresponding properties on o
                // example if varNum == 38, how do I reference
                // o.(propPrefix+Nbr+varNum.ToString())
                // and
                // o.(propPrefix+Data+varNum.ToString())
                // so I may set them? 
            }
        }

Alle hjelpe er verdsatt. Jeg er en rookie når det kommer til refleksjon.

Takk, ~ ck i San Diego

Publisert på 29/12/2009 klokken 22:44
kilden bruker
På andre språk...                            


3 svar

stemmer
2
VendorObj vndr = new VendorObj();

Console.WriteLine("\nInitial value of instance property: {0}", vndr.InstanceProperty);

PropertyInfo piInstance = typeof(VendorObj).GetProperty("InstanceProperty");

Object obj = piInstance.GetValue(vndr, null);

piInstance.SetValue(vndr, 37, null);

Console.WriteLine("Final value of instance property: {0}", vndr.InstanceProperty);
Svarte 29/12/2009 kl. 22:52
kilden bruker

stemmer
1

Prøv dette:

const string propPrefix = "UserVar";

VendorObj o = new VendorObj();
foreach (var item in userVars)
{
    int varNum = 0;
    if (Int32.TryParse(item.VariableName, out varNum))
    {
        string name = String.Format("{0}Nbr{1}", propPrefix, varNum);
        o.GetType().GetProperty(name).SetValue(o, "some value", null);
    }
}
Svarte 29/12/2009 kl. 22:52
kilden bruker

stemmer
0

Siden du kommer til å sette mange egenskaper på ett objekt, er du bedre å få den PropertyDescriptorCollection

var o = new VendorObj();
PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(o);
foreach (var item in userVars)
{
    const string propPrefix = "userVar";
    int varNum;
    if (int.TryParse(item.VariableName, out varNum))
    {
        PropertyDescriptor property = properties.Find(propPrefix + "Nbr" + varNum, true);
        property.SetValue(o, item.VariableData);
    }
}
Svarte 30/12/2009 kl. 00:33
kilden bruker

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