繁体   English   中英

C#:通过反思获得价值

[英]C#: Getting value via 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()");

谢谢!

我没有测试过这个,但这里应该有用:

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

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

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

context["car"] = carobject;

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM