私が使用できる非静的メソッドthis.GetType()
では、Type
. Type
静的メソッドで同じものを取得するにはどうすればよいですか? もちろん、 は実行時にしか分からないので、ただ書くtypeof(ThisTypeName)
ことThisTypeName
はできません。ありがとう!
8 に答える
this.GetType()
静的メソッドと同等の 1 つのライナーを探している場合は、次を試してください。
Type t = MethodBase.GetCurrentMethod().DeclaringType
これは、単に使用するよりもはるかにコストがかかる可能性がありますがtypeof(TheTypeName)
。
他の回答では明確にされていないものがありますが、これは実行時にのみ使用できるタイプのアイデアに関連しています。
派生型を使用して静的メンバーを実行する場合、実際の型名はバイナリで省略されます。たとえば、次のコードをコンパイルします。
UnicodeEncoding.GetEncoding(0);
次にildasmを使用します...呼び出しが次のように発行されることがわかります。
IL_0002: call class [mscorlib]System.Text.Encoding
[mscorlib]System.Text.Encoding::GetEncoding(int32)
コンパイラは呼び出しを解決しました-左Encoding.GetEncoding
の痕跡はありません。UnicodeEncoding
それはあなたの「現在のタイプ」の考えを無意味にします、私は恐れています。
別の解決策は、自己参照型を使用することです
//My base class
//I add a type to my base class use that in the
//static method to check the type of the caller.
public class Parent<TSelfReferenceType>
{
public static Type GetType()
{
return typeof(TSelfReferenceType);
}
}
次に、それを継承するクラスで、自己参照型を作成します。
public class Child: Parent<Child>
{
}
typeof(TSelfReferenceType)
これで、 Parent 内の呼び出しタイプType
は、インスタンスを必要とせずに呼び出し元の を取得して返します。
Child.GetType();
静的メソッドでは使用できないためthis
、直接使用することはできません。ただし、オブジェクトのタイプが必要な場合は、GetType
それを呼び出して、this
インスタンスを渡す必要があるパラメーターにします。たとえば、次のようになります。
public class Car {
public static void Drive(Car c) {
Console.WriteLine("Driving a {0}", c.GetType());
}
}
しかし、これは悪い設計のようです。独自の静的メソッド内でインスタンス自体の型を本当に取得する必要があると確信していますか? それは少し奇妙に思えます。インスタンスメソッドを使用しないのはなぜですか?
public class Car {
public void Drive() { // Remove parameter; doesn't need to be static.
Console.WriteLine("Driving a {0}", this.GetType());
}
}
typeof(ThisTypeName) を使用できない理由がわかりません。これが非ジェネリック型の場合、これは機能するはずです:
class Foo {
static void Method1 () {
Type t = typeof (Foo); // Can just hard code this
}
}
ジェネリック型の場合、次のようになります。
class Foo<T> {
static void Method1 () {
Type t = typeof (Foo<T>);
}
}
ここで明らかな何かが欠けていますか?
メンバーが静的な場合、実行時にメンバーがどのタイプの一部であるかが常にわかります。この場合:
class A
{
public static int GetInt(){}
}
class B : A {}
呼び出すことはできません (編集: どうやら、できるようです。以下のコメントを参照してください。
B.GetInt();
メンバーは静的であるため、継承のシナリオには関与しません。したがって、型が A であることは常にわかります。
編集markmnlが私に指摘したように 、このメソッドは、実行可能ファイル/ライブラリを使用してPDBファイルを展開する場合にのみ機能します。
それ以外の場合は、検出される大きな問題になります。開発ではうまく機能しますが、本番環境ではうまくいかない可能性があります。
ユーティリティ メソッド。コードのあらゆる場所から、必要なときにメソッドを呼び出すだけです。
public static Type GetType()
{
var stack = new System.Diagnostics.StackTrace();
if (stack.FrameCount < 2)
return null;
return (stack.GetFrame(1).GetMethod() as System.Reflection.MethodInfo).DeclaringType;
}