Kann ich Reflexion und eine Zeichenfolge zu erhalten / die richtige Eigenschaft eines Objekts festgelegt?

stimmen
0

Ich verwende c # & .NET 3.5. Ein Anbieter gibt uns ein Objekt, das Eigenschaften von UserVarNbr1 hat, UserVarData1, UserVarNbr2, UserVarData2, ... UserVarNbrN, UserVarDataN. Nicht so, wie ich es codiert haben würde, aber dennoch, das ist, was müssen wir arbeiten. Eine weitere Aufgabe in der Anwendung gibt eine Sammlung von Gegenständen verwendet, um diese UserVariables darstellen.

Die Sammlungsobjekte haben Eigenschaften wie diese

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


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

Ich muss durch die Sammlung in einer Schleife und eine Instanz des Objekts Anbieter erstellen und die richtigen Eigenschaften aufweisen. UserVarNbrN muss UserVarDataN an der richtigen Stelle gesetzt werden. Beachten Sie die Sammlung ein Variablenname als String „03“ zurückgibt, diese VendorObject Eigenschaften UserVarNbr3 fahren muss, UserVarData3 ** bemerken keine „0“ in der aktuellen Eigenschaftsnamen. Wie verweisen ich die richtige Eigenschaft erhalten / einstellen?

var o = new VendorObj();

Ich habe so etwas wie dies bisher.

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

Jede Hilfe ist willkommen. Ich bin ein Neuling, wenn es um Reflexion kommen.

Danke, ~ ck in San Diego

Veröffentlicht am 29/12/2009 um 23:44
quelle vom benutzer
In anderen Sprachen...                            


3 antworten

stimmen
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);
Beantwortet am 29/12/2009 um 23:52
quelle vom benutzer

stimmen
1

Versuche dies:

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);
    }
}
Beantwortet am 29/12/2009 um 23:52
quelle vom benutzer

stimmen
0

Da Sie viele Eigenschaften auf der einen Objekteinstellung wird, sind Sie besser dran, bekommen die 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);
    }
}
Beantwortet am 30/12/2009 um 01:33
quelle vom benutzer

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