2

クラスにパブリック静的プロパティがあります。クラスには、いくつかのカスタム属性が適用されています。静的プロパティの属性にアクセスしたい。

非静的メンバーでは、this.GetType()を使用して現在のクラスのタイプを取得できますが、クラスの静的メンバーでこれを行うにはどうすればよいですか?

その点に注意してください..

  • 継承の問題があるため、typeof(typename)を使用したくありません。[このプロパティは派生クラスに継承されます。]。

  • また、ジェネリックも使いたくありません。

編集

これが私の目的です。

EntityBaseという抽象基本クラスがあります。私のすべてのエンティティはこのクラスから派生しています。各エンティティには、実行時に参照/マップするテーブルを通知するTableMappingAttributeというカスタム属性もあります。EntityBaseには、エンティティのマップされたTableNameを返すプロパティがすでにあります。

TableNameプロパティにアクセスするには、常にエンティティのインスタンスが必要です。MyEntity.TableNameのように、いつかこのプロパティに静的にアクセスしたいと思います。私のプロジェクトには大量のエンティティがあります。この静的プロパティをEntityBaseクラス自体に追加したいと思います。したがって、実行時に型を検出する必要があります。EntityBaseクラス自体でこれを行うにはどうすればよいですか?

Thnaks。

4

6 に答える 6

4

基本的にはできません。typeof(...)あなたが使用する必要があるものです。

使用しようとする場合は、次の点に注意してください。

Type type = MyDerivedType.SomeStaticProperty;

宣言さMyBaseTypeていますが、実際には次のようにコンパイルされます。

Type type = MyBaseType.SomeStaticProperty;

とりあえず。静的メンバーは基本的に多形ではありません。それらを多形的に使用しようとすると、このような問題が発生します。

編集:あなたの編集から、あなたはまさに上記のタイプのことをしようとしているように見えます、

MyEntity.TableName

それ以外の

EntityBase.TableName

それはうまくいきません。コンパイラは、EntityBase.TableNameをフェッチするためのコードを発行します。ランタイムには「現在のクラス」の概念はありません。ここにはコンテキストはありません。

基本的にはデザインを変更する必要があります。継承を使用する場合は、並列階層が必要になる場合があります。1つはメタデータ(テーブル名など)用で、もう1つは実際のオブジェクト用です。したがって、次のようなものがあります。

public class MyEntity : EntityBase<MyEntityType>

ここで、MyEntityTypeは、並列階層のEntityTypeから派生します。次に、メタデータ階層内で継承を使用できます。

あるいは、とにかくEntityBaseを汎用にするだけで、話しているエンティティのタイプを取得できます。

public class MyEntity : EntityBase<MyEntity>

ジェネリックを使いたくないと言っていたのは知っていますが、やりたいことはうまくいかないので、少なくともそれを検討する必要があります...

于 2009-07-14T08:26:15.593 に答える
2

継承の問題があるため、typeof(typename)を使用したくありません。

静的プロパティは、通常の意味では継承されません。確かに、それらは範囲内ですが、それは同じではありません。必要なものを取得する唯一の方法はスタックフレームを確認することですが、それは醜くてハッキーです(最適化が有効になっている場合は危険です)。

instace...インスタンスを使用するソリューションをリファクタリングしますType

于 2009-07-14T08:27:17.633 に答える
0

System.Diagnostics.StackFrameこのクラスは、次のような静的メソッドで使用できます。

StackFrame currentStackFrame = new StackFrame();
Type type = currentStackFrame.GetMethod().DeclaringType;
于 2009-07-14T08:26:30.460 に答える
0

staticプロパティが;の場合、継承について心配する必要はありません。オーバーライドすることはできないため、とにかく基本クラスで常に宣言されます。使用typeofすることは行く方法です。

于 2009-07-14T08:28:11.937 に答える
0

typeof()を使用したくない場合は、運が悪いことになります。これは、静的クラスのTypeオブジェクトを取得する唯一の方法であるためです(Type.GetType()を呼び出して型を検索する場合を除きます)。名前で探してください)

ただし、継承の問題はわかりません。

Type type = typeof(YourStaticClass);

Attribute[] attributes = type.GetCustomAttributes(...);
于 2009-07-14T08:28:38.020 に答える
0

親は子供が何人いるかわかりません。しかし、子供はその親について知っています。親が子について知る必要がある唯一の方法は、静的メンバーの属性ではないポリモーフィズムを使用することです。

あなたがやろうとしていることは、親のパブリック静的プロパティの子クラスについて知ることです。子クラスの参照を基本クラスの静的メソッドのパラメーターとして送信し、次に基本クラスでGetTypeメソッドを呼び出して子クラスの参照を取得することを検討してみませんか...

public static string GetTableName(BaseClass childsObjectWrappedInBaseReference) {
   Type type = childsObjectWrappedInBaseReference.GetType();
   ....
   ....
}
于 2009-07-14T08:32:46.983 に答える