2011-01-31 12 views
4

System.Diagnostics.StackTraceを使用してExceptionFactoryクラスを作成しています。 typeof(Base)を返すクラススタックトレースから実際のタイプを取得できますか?

class Base 
{ 
    public void Foo() 
    { 
     //Call ExceptionFactory from here 
    } 
} 
class A : Base {} 

//... 

var x = new A(); 
x.Foo(); 

method.DeclaringTypeのための今

var trace = new StackTrace(1, true); 
var frames = trace.GetFrames(); 
var method = frames[0].GetMethod(); 

、。しかし、私はtypeof(A)が必要です。何とかなることは可能ですか?

​​3210も動作しません。

+3

ExceptionFactoryとは何ですか? –

+0

これは呼び出しの場所に基づいてカスタム例外をパラメータ化します(Module:呼び出し型のカスタム属性など)。これが実際の型を必要とするため、クラスAの代わりに属性Baseをクエリできます。 – TDaver

+0

ReflectedTypeはなぜ機能しないのですか?それは何を返すのですか? – Vlad

答えて

4

いいえ、このメソッドは実際にBaseに宣言されています。メソッドがオーバーライドされていない限り、基本クラスまたは派生クラスでクエリを実行するかどうかに関係なく、常にメソッドのインスタンスが同じMethodInfoになります。

しかし、なぜ他のタイプが最初に必要ですか?あなたの問題には別の解決策があるかもしれません。それが私がこれを求めている理由です。

+0

私の基本クラスには、基本的な操作(削除、挿入など)が含まれています。何か問題がある場合は、操作タイプ(挿入、削除など)、レイヤー(ビジネスロジック、データアクセスなど)、エラーの場所のモジュールを特定して、例外を発生させたいと思います。しかし、問題がモジュール "Project1"にあり、ベースが "Framework"にあるクラスAにある場合は、モジュールを "Project1"にしたいが、例外はBaseで発生しているので、 "Framework "... – TDaver

+0

"フレームワーク "で定義されたメンバーが仮想または抽象で、" Project1 "クラスによってオーバーライドされている場合は、必要な情報を取得します。 – Lucero

+0

オーバーライドされていないケース私はexceptionFactoryに自分自身で必要なデータ(モジュールと実際のClassName)を提供します。指定されていない場合は、StackTraceを検索します。 – TDaver

0

ええと、ちょうどthis.GetType()を使用してください。それはサブクラスを返します。次のコードスニペットは "A"を出力します。

public void Foo() 
{ 
    System.Diagnostics.Debug.Print(this.GetType().ToString()); 
} 
+2

私の理解から、 'ExceptionFactory'は例外を生成するためにスタックトレースに依存する別のクラスです。そのため、利用可能な「this」が存在しない可能性があります。 – Lucero

+0

正確には、他の解決策がない場合は、タイプパラメータを取るでしょう(ただし、それはトレースの最初のレベルにしか対応しないので、あまりうまくいかないので、グローバルな解決策ではありません...) – TDaver

+0

メソッド*の中にいるか、少なくとも同じ型の中にいる限り*これは機能します。別の型のメソッドへの呼び出しを行うと、呼び出されたヘルパーメソッドが静的であるかどうかにかかわらず、これは(明らかに)オプションになりません。 –

関連する問題