5 Stimmen

C#: Wert über Reflexion erhalten

Ich würde gerne wissen, ob es möglich ist, so etwas zu tun:

class brand
{
  string name;
}

class car
{
   string carname;
   brand carbrand;
}

Jetzt habe ich einen String wie diesen und ein instanziiertes Objekt vom Typ Auto:

 car carobject = new car();
 string brandNameOfCar = DoSomeMagicalReflectionStuff(car, "car.brand.name");

Wie würde die Methode "DoSomeMagicalReflectionStuff" aussehen?

Und ist es überhaupt möglich, so etwas zu tun:

 car carobject = new car();
 string brandNameOfCar = DoSomeMagicalReflectionStuff(car, "car.brand.name.ToFormatedString()");

Ich danke Ihnen!

4voto

John Fisher Punkte 21825

Ich habe das nicht getestet, aber hier ist etwas, das funktionieren sollte:

car c = new car();
object val = typeof(car).GetField("carbrand", BindingFlags.Private).GetValue(c);
string result = (val as brand).ToFormattedString();

1voto

Philippe Leybaert Punkte 161931

Normalerweise versuche ich nicht, für Produkte zu werben, an denen ich beteiligt bin, aber dies ist ein perfektes Problem, das durch Vici-Parser (quelloffener Ausdrucks-Parser für .NET):

var parser = new CSharpParser();
var context = new CSharpContext();

context["car"] = carobject;

string brandNameOfCar = 
          parser.Evaluate<string>("car.brand.name.ToFormatedString()", context);

0voto

Rune FS Punkte 20934

Typeof(Auto).GetProperty("Marke", bindingflags.instance | bindingflags.private).GetValue(AutoObjekt,null) sollte es tun. Sry für kleinere Syntaxfehler Bit im auf meinem Telefon

Bearbeiten: die oben wird Ihnen die Marke Objekt und Sie können die dó das gleiche, um die Eigenschaft Name zu erhalten

0voto

Yuriy Faktorovich Punkte 64670

Wäre es sinnvoller, einen Konstruktor von car zu haben, der eine Zeichenkette als Parameter nimmt und etwas wie das Folgende tut:

class brand
{
    public string name;
}

class car
{

    public car(string s)
    {
        Match match = Regex.Match(s, @"(?<carname>[^\.]+)\.(?<brandname>.+)");
        if (match.Success)
        {
            this.carname = match.Groups["carname"].Value;
            this.carbrand = new brand();
            this.carbrand.name = match.Groups["brandname"].Value;
        } else
        {
            throw new ArgumentException("Not a valid car");
        }
    }

    string carname;
    brand carbrand;

    public override string ToString()
    {
        return carname + "." + carbrand.name;
    }
}

Mit der folgenden Verwendung:

car c = new car("M5.BMW");
Console.WriteLine(c.ToString());

Man könnte es natürlich in eine Parse- und TryParse-Methode aufteilen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X