2017-11-14 10 views
1

문자열을 사용하여 객체에 대한 반사를 수행 할 수있는 라이브러리를 찾고 있습니다 (예 :문자열 기반의 .NET 객체에서 리플렉션을 수행 할 라이브러리가 있습니까?

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" 

하지 않으면, 나는 하나의 오픈 소싱을 쓰고 고려 중이 야 그것 -하지만 난 다시 발명 바퀴에 싶지 않았다. 처음에는 속성 값을 얻지 만 장기적으로는 메소드 실행에 필요한 인수를 파싱하는 기능을 얻을 수 있습니다.

내가 찾은 가장 가까운 XPath 스타일 라이브러리 https://code.google.com/archive/p/antix-software/wikis/AntixReflectionQuery.wikiUsing an XPath-style Query with ReflectionTraversing an arbitrary C# object graph using XPath/applying XSL transforms으로 참조되지만 더 이상 사용할 수없는 것으로 보입니다.

+0

좋은 질문을! 이 구문 ('Child.SomeValue')은 다양한 데이터 바인딩 기능 (예 : WPF 데이터 바인딩)에서 사용되므로 BCL 자체에서 뭔가를 찾을 수도 있습니다. – Heinzi

답변

2

.NET 기본 클래스 라이브러리에는 원하는대로 정확하게 수행하는 DataBinder 클래스가 들어 있습니다.

이것은 ASP.NET WebForms 데이터 바인딩 용으로 설계되었으므로 System.Web.UI 네임 스페이스에 있으며 System.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 
+0

가능한 경우'nameof'를 사용하려고합니다. 'int index = 0; $ {nameof (SampleClass.Children)} {{index}} {nameof (SampleClass.SomeValue)} "'=>'"Children [0] .SomeValue "' – BurnsBA

+0

훌륭합니다. 장기간에 걸쳐 기능 평가를 허용하는 몇 가지 아이디어가있었습니다. SomeObject.GetResultsBefore ('2017-05-01')하지만 지금은 좋은 출발이며 필요한 것이 확실하지 않습니다. –