C#:通过反射获取价值
我想知道是否有可能这样做:C#:通过反射获取价值,c#,reflection,C#,Reflection,我想知道是否有可能这样做: class brand { string name; } class car { string carname; brand carbrand; } 现在我有了这样一个字符串和一个car类型的实例化对象: car carobject = new car(); string brandNameOfCar = DoSomeMagicalReflectionStuff(car, "car.brand.name"); “DoSomeMagicalRe
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()");
谢谢大家! 我通常不会尝试插入我参与的产品,但这是一个需要(针对.NET的开源表达式解析器)解决的完美问题:
var parser=new CSharpParser();
var context=new CSharpContext();
上下文[“car”]=carobject;
字符串brandNameOfCar=
Evaluate(“car.brand.name.ToFormatedString()”,上下文);
Typeof(car).GetProperty(“brand”,bindingflags.instance | bindingflags.private).GetValue(carobject,null)
应该如此。Sry针对手机上的小语法错误bit im
编辑:以上内容将为您提供brand对象,您可以使用相同的dóthe属性来访问name属性我没有对此进行测试,但这里有一些东西应该可以使用:
car c = new car();
object val = typeof(car).GetField("carbrand", BindingFlags.Private).GetValue(c);
string result = (val as brand).ToFormattedString();
让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;
}
}
你当然可以把它分为Parse和TryParse方法。为什么不直接使用carobject.carbrand.name?因为这只是一个愚蠢的例子,在“真正的应用程序”中,我希望能够灵活地访问任何这样的实体,我想做一些“模板化”就像这样,需要从上面的字符串访问显式的实体信息。这看起来真的很糟糕。@Jan:为什么?他似乎想实现某种DSL,这并没有什么错。如果你要求的话,这对使用.net的bcl轻松实现的东西来说是一种过分的杀伤力me@Rune:你不知道他为什么想要计算字符串中表达式的东西。我个人经常使用动态表达式解析来创建非常简单的DSL解决方案。哇,有人应该拿走你的键盘持有者许可证!为什么是一根绳子?为什么要解析它?为什么不是两个论点?o_obe因为问题传递的是一个字符串,例如,如果它正在解析一个来自某个有很多汽车的地方的文件。虽然对您有利,但标准是不要有一个带有类似字符串的构造函数,而是一个解析方法。
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());