ここに挑戦的なものがあります。メソッドにパラメーターとして渡されるプロパティの名前を暗黙的に決定するために、任意のメソッドを使用することは可能ですか?
(これは一見、別の質問の重複のように見えるかもしれませんが、キーとなるプロパティを常に操作している限り、微妙ではあるが重要な違いがあります)。
シナリオの例を次に示します。
public class Foo
{
public string Bar { get; set; }
}
public void SomeStrangeMethod()
{
Foo foo = new Foo() { Bar = "Hello" };
string result = FindContext(foo.Bar); // should return "Bar"
}
public string FindContext(object obj)
{
// TODO? - figure out the property name corresponding to the passed parameter.
// In this example, we need to somehow figure out that the value of "obj"
// is the value of the property foo.Bar, and return "Bar"
}
FindContext 内から、渡されたパラメーターは常にオブジェクトのプロパティであると想定します。問題は、どのオブジェクトかがわからないことです。
明らかに、不足しているコンテキストを提供する 2 番目のパラメーターを渡すことで、問題を簡単に解決できます。
FindContext(foo, foo.Bar);
FindContext("Bar", foo.Bar);
....しかし、それは私が望むものではありません。単一のパラメーターを渡して、値によって表されるプロパティ名を決定できるようにしたいと考えています。
パラメータが渡されたとき、FindContext のメソッド コンテキストには、これを判断するのに十分な情報が含まれていないことを理解しています。ただし、スタック トレースと IL を少し巧みに操作すれば、おそらくまだ可能です。これが可能でなければならないと私が考える理由は次のとおりです。
FindContext に渡されるパラメーターは常に別のオブジェクトのプロパティでなければならないという要件があり、リフレクションを使用してそのプロパティ名を取得できることがわかっています。
StackTrace を使用して、呼び出しコンテキストを取得できます。
呼び出しコンテキストから、使用されているシンボルを何らかの方法で見つけることができるはずです。
そのシンボルから、プロパティ名および/または呼び出し元オブジェクトのタイプを取得できる必要があります。これは、(1) を介して呼び出し元オブジェクトのプロパティに変換できるはずです。
誰もこれを行う方法を知っていますか? 注: この質問は難しいですが、不可能ではないと思います。誰かが不可能な理由を証明できない限り、「不可能」という回答は受け付けません。