C#:通过反思获得价值

时间:2009-09-15 15:16:02

标签: c# reflection

我想知道是否可以这样做:

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 个答案:

答案 0 :(得分:4)

我没有对此进行测试,但这里应该有效:

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

答案 1 :(得分:1)

我通常不会尝试插入我参与的产品,但这是Vici Parser(.NET的开源表达式解析器)要解决的完美问题:

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

context["car"] = carobject;

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

答案 2 :(得分:0)

Typeof(car).GetProperty(“brand”,bindingflags.instance | bindingflags.private).GetValue(carobject,null) 应该如此。在我的手机上点击我的小语法错误

编辑:以上将给你品牌对象,你可以dó相同的到达名称属性

答案 3 :(得分:0)

拥有一个以字符串作为参数的汽车构造函数更有意义,并执行以下操作:

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方法。