独自のクラス名を取得するC#


464

というクラスMyProgramがある場合、「MyProgram」を文字列として取得する方法はありますか?

回答:


743

これを試して:

this.GetType().Name

36
静的メソッドを使用している場合、開発者は型の名前が何であるかを知っています。ソースコードに文字列として入力するだけです。
Eric Lippert、2010年

122
@EricLippert:名前を入力した場合、クラスの名前が変更されてもコンパイラはキャッチしません。
ハルバード2013年

12
@Halvard:まず、静的メソッドが現在のタイプの場合、名前はオプションです。変更が心配な場合は省略してください。次に、Visual Studioは、そのすべてのインスタンスの名前を変更するクラスの名前を変更すると、自動的にスマートタグを提供します。そして3番目に、クラスの名前を変更する場合は、オッズが良いので、すでに多くの場所で多くの変更を行う必要があります。
Eric Lippert

12
@EricLippertあなたは正しいです。任意の新しい Visual StudioまたはReSharperのバージョンの名前が変更されているクラスと同じ名前の文字列をキャッチします。私の以前のコメントは、古くて今では役に立たない知識です...
Halvard

17
@Halvard:...そしてC#6ではnew nameof演算子を使用できます。
Eric Lippert

238

私はこれをかなりの量のために捨てたかったのです。@micahtanの投稿方法が好ましいと思います。

typeof(MyProgram).Name

24
1.静的コンテキストで機能します2.コンパイル時間を計算するので、リフレクションのようなコストはかかりません
Gilbert

6
@JimBalter複数の利点があります:1.静的コンテキスト。2.タイプの部分は、CLRによって毎回再評価されることはありません。MSILに書き込まれます。3.新しい「GetType()」を宣言する誰かからあなたを守ります。
ギルバート

11
継承されたクラス名を取得する必要があり、この呼び出しが親にある場合、機能しません。
Gh61 14

10
これには、型を明示的に参照する必要があるという欠点があり、再利用しにくくなります。
cprcrack

20
C#6.0以降ではできますnameof(MyProgram)
オーウェンジョンソン


127

ミカタンの答えは良いですが、静的メソッドでは機能しません。現在のタイプの名前を取得したい場合、これはどこでも動作するはずです:

string className = MethodBase.GetCurrentMethod().DeclaringType.Name;

2
この場合は私の方法が好ましいと思いますが、いいキャッチです。
ChaosPandion、2010年

5
これは、メソッドが宣言され実装されている型の名前(おそらく継承チェーンの上位)を返すため、非仮想メソッドでは機能しません。実際にコードを実行しているインスタンスの具体的な型ではありません。から。
Charles Bretana、2010年

1
これは、DNX(Dot Net Execution)フレームワークでは機能しないようです。彼らはGetCurrentMethod()メソッドを削除し、GetMethodFromHandle()のみを残しました。
Astaar

これは、子孫の仮想関数から呼び出された現在実行中のコードの具象クラスの名前を取得するために必要なものです。
DrFloyd5

15

参考までに、別のタイプを継承するタイプがある場合は、

this.GetType().BaseType.Name

12

派生クラスでこれが必要な場合は、そのコードを基本クラスに配置できます。

protected string GetThisClassName() { return this.GetType().Name; }

その後、派生クラスの名前に到達できます。派生クラス名を返します。もちろん、新しいキーワード「nameof」を使用する場合、このようなさまざまな行為は必要ありません。

さらに、これを定義することができます:

public static class Extension
{
    public static string NameOf(this object o)
    {
        return o.GetType().Name;
    }
}

そして、このように使用します:

public class MyProgram
{
    string thisClassName;

    public MyProgram()
    {
        this.thisClassName = this.NameOf();
    }
}

10

これを使って

アプリケーションTest.exeが実行中で、関数がform1のfoo()であるとしましょう基本的にはform1です)、上のコードは以下の応答を生成します。

string s1 = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name;

これは戻ります。

s1 = "TEST.form1"

関数名:

string s1 = System.Reflection.MethodBase.GetCurrentMethod().Name;

戻ります

s1 = foo 

これを例外的に使用したい場合は注意してください:

catch (Exception ex)
{

    MessageBox.Show(ex.StackTrace );

}

DeclaringTypeが宣言されている[Nullable(2)]ため、nullチェックがアクティブなときに警告が表示されます。
マーティン

@Martin、コメントを説明してください。わかりませんか?
NoChance


2

Asp.netの現在のクラス名を取得する

string CurrentClass = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name.ToString();

1
DeclaringTypeが宣言されている[Nullable(2)]ため、nullチェックがアクティブなときに警告が表示されます。
マーティン、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.