C #: получение значения с помощью отражения - PullRequest
5 голосов
/ 15 сентября 2009

Я хотел бы знать, возможно ли сделать что-то вроде этого:

class brand
{
  string name;
}

class car
{
   string carname;
   brand carbrand;
}

теперь у меня есть такая строка и экземпляр объекта типа car:

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

Как будет выглядеть метод DoSomeMagicalReflectionStuff?

И возможно ли сделать что-то вроде:

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

Спасибо!

Ответы [ 4 ]

4 голосов
/ 15 сентября 2009

Я не проверял это, но вот что должно работать:

car c = new car();
object val = typeof(car).GetField("carbrand", BindingFlags.Private).GetValue(c);
string result = (val as brand).ToFormattedString();
1 голос
/ 15 сентября 2009

Я обычно не пытаюсь подключить продукты, в которых я участвую, но это идеальная проблема, решаемая Vici Parser (синтаксический анализатор с открытым исходным кодом для .NET):

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

context["car"] = carobject;

string brandNameOfCar = 
          parser.Evaluate<string>("car.brand.name.ToFormatedString()", context);
0 голосов
/ 15 сентября 2009

Имеет ли смысл иметь конструктор car, который принимает строку в качестве параметра и выполняет что-то вроде следующего:

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

При следующем использовании:

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

Конечно, вы можете разделить его на методы Parse и TryParse.

0 голосов
/ 15 сентября 2009

Typeof (car) .GetProperty ("brand", bindingflags.instance | bindingflags.private) .GetValue (carobject, null) должно так оно и есть. Прошу прощения за незначительные синтаксические ошибки на моем телефоне

редактировать: выше, даст вам объект бренда, и вы можете сделать то же самое, чтобы добраться до свойства name

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...