2017-11-14 2 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" 

ない場合、私は1つ、それをオープンソース化を書いて検討している - しかし、私は再発明ホイールたくありませんでした。当初はプロパティ値を取得するだけでしたが、長期的にはメソッドを実行し、必要に応じて引数を解析することができました。

私が見つけた最も近いのはhttps://code.google.com/archive/p/antix-software/wikis/AntixReflectionQuery.wikiで、Using 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; {name}(SampleClass.SomeValue)} "' => '" Children [0] .SomeValue "' – BurnsBA

+0

ありがとう、ありがとう。私は長期間に渡って機能評価を許可するアイディアをいくつか持っていました。 SomeObject.GetResultsBefore( '2017-05-01')しかし、これは今のところ素晴らしいスタートであり、私はそれが必要になるかどうかはわかりません。 –

関連する問題