是否有一个库可以根据字符串对.Net对象进行反射?

时间:2017-11-14 09:56:10

标签: c# .net reflection

我正在寻找一个允许您使用字符串对对象执行反射的库,例如

class SampleClass {
    public SampleClass Child {get; set;}
    public string SomeValue {get;set;}
}
var a = new SampleClass { Child = new SampleClass { SomeValue = "v"}};
var parser = new ReflectionParser();
var result = parser.Parse("Child.SomeValue", a);
// result is "v"

如果没有,我正在考虑写一个并开源 - 但我并不想重新发明轮子。最初它只是获取属性值,但从长远来看,我可以看到它能够运行方法,根据需要解析参数。

我找到的最接近的是https://code.google.com/archive/p/antix-software/wikis/AntixReflectionQuery.wikiUsing an XPath-style Query with Reflection中引用的XPath样式库Traversing an arbitrary C# object graph using XPath/applying XSL transforms - 但这似乎不再可用了。

1 个答案:

答案 0 :(得分:2)

.NET基类库包含一个DataBinder类,它完全符合您的要求。

它是为ASP.NET WebForms数据绑定而设计的,因此它位于System.Web.UI命名空间中,需要引用System.Web。但是不要让它阻止你,它也可以在Web项目之外使用。

class SampleClass
{
    public SampleClass Child { get; set; }
    public SampleClass[] Children { get; set; }
    public string SomeValue { get; set; }
}

var a = new SampleClass { Child = new SampleClass { SomeValue = "v" } };

var result = DataBinder.Eval(a, "Child.SomeValue");
Console.WriteLine(result); // yields v

DataBinder还支持对集合进行索引,因此也可以正确评估Children[0].SomeValue

var a = new SampleClass { Children = new SampleClass[] { new SampleClass { SomeValue = "v" } } };

var result = DataBinder.Eval(a, "Children[0].SomeValue");
Console.WriteLine(result); // yields v