2009-12-08 16 views
16

parms(リフレクションを使用してループ内で)の値を取得する方法を教えてください。 以前の質問では、誰かが反射を使ってparmsをループする方法を教えてくれました。私はこれをしたい理由を知っていなければならない場合C#リフレクションを使用してparmsの値を取得する

static void Main(string[] args) 
{ 
    ManyParms("a","b","c",10,20,true,"end"); 
    Console.ReadLine(); 
} 

static void ManyParms(string a, string b, string c, int d, short e, bool f, string g) 
{ 
    var parameters = MethodBase.GetCurrentMethod().GetParameters(); 
    foreach (ParameterInfo parameter in parameters) 
    { 
     string parmName = parameter.Name; 
     Console.WriteLine(parmName); 
     //Following idea required an object first 
     //Type t = this.GetType(); 
     //t.GetField(parmName).GetValue(theObject)); 

    } 
} 

、こちらを参照してください。すべての .NET Reflection of all method parameters


おかげ - それは、Python、PERL、PHPのように、これは簡単だろうと思われます。
リフレクションではないかもしれませんが、フィールド名を取得するためにリフレクションを使用すると、名前に基づいて値を取得する簡単な動的方法があるようです。 私はAOP(Aspect Oriented Programming)をまだ試していません。 これは、私が1時間か2時間でやり遂げることができなければ、おそらくそれをしないだろうということの一つです。

+0

を参照してくださいたぶん何かが反射によって、あなたがIEnumerableをを使用した場合に生成されるステートマシンを調べることによって行うことができますか?ちょうど私が自分自身を実現する方法を知りませんでした:()今日重複した質問のためにここにコメントしてください – Jbjstam

答えて

19

基本的には、少なくともdebugger/profiling APIにフックすることはできません。理論的には

パラメータ値をさらすStackFrameクラスのいくつかの方法かもしれないが、それはしていません - と、私はそうするためには、あなたはいくつかの最適化を削除する必要があるだろうと思われます。

4

リフレクションではできません。とにかく実行しないでください。

この種の機能が必要な場合は、プロキシを使用してください(例:あなたの呼び出しを傍受するRealProxy実装を介して。その後、実際の呼び出しが行われる前にパラメータを確認して変更することができます(または元の呼び出しをまったくやっていなくてもそれはあなた次第です)。

+0

私は時間があればこれを調べます。上記の私の参照されたポストを参照してください、私はMicrosoftホスト統合サーバーと特にHIPを使用しています - プロキシがそれらの人とどのように再生するかわからない。 – NealWalters

4

これはできません。リフレクションは、コンパイル時に埋め込まれたメタデータに作用し、その時点でパラメータ値はわかりません。

+4

しかし、リフレクションを使ってオブジェクトのプロパティの値を取得することができます。これはコンパイル時にはわかりません。 – NealWalters

4

PostSharpのようにAOPの使用を検討しましたか?

メソッドが実行される前に引数値にアクセスできるため、コードは再利用可能な属性クラスに縮小され、このチェックを必要とするメソッドに属性が適用されます。

2

リフレクションを使用してメソッドのパラメータの値を取得することはできません。リフレクションはメタデータ情報を返します。特定のフィールドやプロパティの値を取得する場合は、インスタンスを使用する必要があります(既に知っているように)。

.NETフレームワークの内部配管(プロファイラAPIとデバッガAPI)を使用してパラメータの値を取得する方法はいくつかあります。

あなたは何をしようとしているのかAOPを使用することができます。CThruというCodeplexプロジェクトがあります。CThruを使用すると、呼び出されたときにメソッドをインターセプトし、呼び出されたパラメータを取得できます。

32

あなたのメソッドの中に匿名型を作成し、投影初期化子を利用することで、これを回避することができます。その後、リフレクションを使用して匿名型のプロパティを調べることができます。たとえば:

static void ManyParms(
    string a, string b, string c, int d, short e, bool f, string g) 
{ 
    var hack = new { a, b, c, d, e, f, g }; 

    foreach (PropertyInfo pi in hack.GetType().GetProperties()) 
    { 
     Console.WriteLine("{0}: {1}", pi.Name, pi.GetValue(hack, null)); 
    } 
} 
+5

そのため、メソッドの内容を変更する必要があります。あなたがそれをやろうとしたら、とにかく値を報告するだけです。この構文は、少し簡単にすることができますが、実際にOPに役立つかどうかは疑問です。 –

+0

@Jon:あなたはもちろんですが、これは手動で行うよりも入力が少なく、 'Console.WriteLine(" a: "+ a)'などのような複数のハードコードされた行がないためですエラーの範囲がはるかに小さくなります。 – LukeH

+2

これはすばらしい作業場です – Serge

関連する問題