2009-09-15 12 views
5

ich würde gerne wissen, ob es möglich ist, so etwas zu tun:C#: Wert über Reflexion Erste

class brand 
{ 
    string name; 
} 

class car 
{ 
    string carname; 
    brand carbrand; 
} 

jetzt habe ich eine Zeichenfolge wie diese haben und eine instanzierte Objekt vom Typ Auto:

Wie würde die Methode "DoSomeMagicalReflectionStuff" aussehen?

Und ist es sogar möglich, wie etwas zu tun:

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

Thank you!

+0

Warum benutzen Sie nicht einfach carobject.carbrand.name? –

+3

Weil dies nur ein dummes Beispiel ist und ich in der "echten Anwendung" die Flexibilität haben möchte, auf irgendeine Entität wie diese zuzugreifen –

+0

Ich würde gerne so etwas "Templating" machen und muss Zugriff auf explizite Entity-Informationen von nur bekommen Schnur wie die oben genannte. –

Antwort

1

Ich versuche in der Regel nicht Produkte zu stecken ich beteiligt bin, aber das ist ein perfektes Problem durch Vici Parser (Open-Source-Ausdrucksparser für .NET) zu lösen:

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

context["car"] = carobject; 

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

hört sich gut an, danke! –

+1

Ein Overkill für etwas, das leicht mit dem bcl von .net implementiert wird, wenn Sie mich fragen –

+1

@Rune: Sie wissen nicht wirklich die Gründe, warum er etwas will, das Ausdrücke in einer Zeichenfolge auswertet. Ich persönlich benutze Dynamic Expression Parsing sehr für die Erstellung sehr einfacher DSL-Lösungen. –

0

TypeOf (Auto) .GetProperty ("Marke", bindingflags.instance | bindingflags.private) .GetValue (Autoobjekt, null) sollte so sein. Sry für kleinere Syntaxfehler Bit im auf meinem Handy

edit: die oben Werden Sie die Marke Objekt geben und Sie können das tun das gleiche mit dem Namen Eigenschaft

4

ich dies testen nicht zu bekommen, 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(); 
0

Wäre es sinnvoll, einen Konstruktor Auto zu haben, die einen String als Parameter annimmt und tut etwas wie folgt aus:

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

Wit h die folgende Verwendung:

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

Sie könnten es natürlich in eine Parse- und TryParse-Methode trennen.

+1

Wow, jemand sollte deine Keyboardhalter-Lizenz von dir nehmen! Warum eine Schnur? Warum Parsing? Warum nicht 2 Argumente? o_O –

+0

Da die Frage in einer Zeichenkette übergeben wurde, zum Beispiel, wenn sie eine Datei von irgendwo analysierte, die viele Autos hatte. –

+0

Obwohl zu Ihren Gunsten, ist der Standard, keinen Konstruktor mit einer solchen Zeichenfolge zu haben, sondern stattdessen eine Parse-Methode. –