Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:通过反射获取价值_C#_Reflection - Fatal编程技术网

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());