- 題名: staticメソッドと継承先クラスで自身のクラス名を取得する方法。
- 日時: 2012/07/13 14:42:48
- ID: 30735
- この記事の返信元:
- (なし)
- この記事への返信:
- [30737] Re[1]: staticメソッドと継承先クラスで自身のクラス名を取得する方法。2012/07/13 16:11:27
- ツリーを表示
■No30735に返信(ひらまろさんの記事) > public static GetNameStatic() public static string GetNameStatic() では無く? > staticメソッド内で自クラスの名前を取得したい。 強いて挙げれば return System.Reflection.MethodInfo.GetCurrentMethod().DeclaringType.Name; あるいは return System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name; あるいは return new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().DeclaringType.FullName; あるいは return new System.Diagnostics.StackFrame().GetMethod().DeclaringType.Name; などでしょうか。遅いですけれどね。 最速はもちろん「return typeof(Class1).Name;」あるいは 「return "Class1";」ですが、これでは要件を満たせませんね。 あとは、自クラス名を返すメソッドを持ったクラスを定義するための CodeSnippet を用意するぐらいでしょうか。 > //もし取得できても"Class1"が返ってきそう Class2 で //public static string GetNameStatic() public new static string GetNameStatic() のようにシャドウイングされれば、Class2.GetNameStatic の呼び出しになりますし、 Class2 で一切定義されていなければ、Class1.GetNameStatic が呼び出されるかと。
■No30738に返信(ひらまろさんの記事) 今回の事を実現するのにstaticにこだわる理由はなんでしょう? インスタンス作る方法であれば簡単に出来ることです。 public class Class1 { public string GetTypeName() { return this.GetType().Name; } } public class Class2:Class1 { } Class1 obj1 = new Class1(); Class2 obj2 = new Class2(); Console.WriteLine("obj1.GetTypeName= " + obj1.GetTypeName()); Console.WriteLine("obj2.GetTypeName= " + obj2.GetTypeName()); で十分です。 というか型名を取得して何か処理をしなければいけないというのは結構特殊なものだと思います。実際に目的としている処理を行うのにもっと適切な方法があるのではないでしょうか?
分類:[.NET]
初めまして。
表題の件ですが、以下に短いサンプルスクリプトを記述させて頂きました。
以下のスクリプトでやりたいことは2つです。
@staticメソッド内で自クラスの名前を取得したい。
A継承先のクラスで何も書かずに継承先クラスの名前を取得したい。
いろいろ試した結果、C#の仕様上できない線が濃厚になってきましたので、
本当にできないのかどうか、皆様の知恵をお借りさせて頂けないでしょうか。
よろしくお願い致します。
//自身のクラス名を返すクラス
public class Class1
{
//普通に取得できる。
public string GetName()
{
return this.GetType().Name;
}
//インスタンスを生成していないので取得できない。
public static GetNameStatic()
{
return this.GetType().Name;
}
}
//上記クラスを継承して楽をしようとするクラス
public class Class2 : Class1{}
//"Class1"が返る
new Class1().GetName();
//取得できない
Class1.GetNameStatic();
//これも"Class1"が返る
new Class2().GetName();
//もし取得できても"Class1"が返ってきそう
Class2.GetNameStatic();