okこれは簡単な質問ではありません。あなたが自己参照、ジェネリッククラス、静的コンストラクタでクラスの型を取得します。
ような何かを行うときにpublic class ClassA : BaseClass<ClassA>{
}
public abstract class BaseClass<T> where T : BaseClass<T> {
static readonly int _aValue;
static BaseClass(){
//here i have code that load _avalue for each kind of T type, based on my own logic
_aValue=1;
//need to get the real type here
}
public int GetValue() {
return _aValue;
}
}
ClassA c = new ClassA();
Console.WriteLine(c.GetValue());
:私は必要なもの
は、あなたがこのようなコードを持っている想像自己参照でクラスの型を取得する方法、ジェネリッククラス、静的コンストラクタ
です起こる何ここ
ClassA c = new ClassA();
Console.WriteLine(c.GetValue());
は、静的コンストラクタが呼び出されます、それは静的変数
0123に私の例では値をロードすることですT型は、実際にClassA であれば、私は、コンストラクタを呼び出すのタイプがあれば、静的コンストラクタに知っておく必要があります(ジェネリック型のコンストラクタで各派生クラスはそれを呼び出すので、私は私が必要なものを行うことができます仮定)私の本当の必要性は、私は正しく私のクラス定義を宣言した場合、私は私のテストでは、私が見つけたので、自己参照型が本当の自己参照されていることを確実にする良い方法を見つけることがありますので、知っている
ClassX : Message<ClassAAA>
doesnのこと私は強制したいと思う間にエラーが起きる
ClassA : Message<ClassA>
ClassB : Message<ClassB>
ClassC : Message<ClassC>
なく
ClassD : Message<DifferentClass>
任意の手掛かり?
私はすでにMethodInfo.GetMethod()。DeclaringTypeを使用してみましたが、それは基本クラスを返し
UPDATE OK私は、私はこの種の設計を使用して、私のシナリオでは もう少し説明してみましょうクライアント/サーバのシナリオで使用するカスタムメッセージ定義を持っていて、それぞれの異なるメッセージ派生クラスには「メッセージID」を指定するバイトが必要です。そのため、属性を使用してクラスを修飾し、その属性を使用して、私はコードの周りに魔法の番号を持っていない)
私の静的なコンストラクタメッセージベースクラスは、リフレクションを使用して属性値を読み込んで静的な_aValueメンバーに格納するため、あらゆる種類のMessageに独自のメッセージIDがあり、パフォーマンスの理由から、すべてのメッセージタイプで一度だけロードされます。 。 私が
[MyAttribute(MyMessages.Ping)]
public class PingMessage : Message<PingMessage>
と私のPingMessageクラスがistantiatedされるたびに、私はその静的messageTye値を取得することができますし、私はそれで満足しているようなクラスを聞かせて持っていると言うことができ、非常にうまく機能し、問題が時々起こるということですその間違いを、私はAnotherMessageが、それは合法ですので、メッセージを継承別のクラスであるため、コンパイル時エラーが上昇しない
[MyAttribute(MyMessages.Ping)]
public class PingMessage : Message<AnotherMessage>
とジェネリック制約ようなクラスを作成しますが、私は、もしことを強制したいのであなたはMessageから継承しています。Tは継承するクラスでなければならないので、ただ許可してください
PingMessage : Message<PingMessage>
私はこれを行うための一般的な制約はないことを知っています。もちろん、作成するメッセージがわからないため、派生クラスを制約に追加することはできませんとにかくたくさんのメッセージを持っていると意味がありません)、メッセージ型の静的コンストラクタの中で私の型制約チェックをしたかったのです。私は既にそこで何かをしていて、私には型が間違っていないか、クラスに属性が指定されていない場合に例外が発生する
技術的には、私のインスタンスコンストラクタでこの種のチェックを行うことができますが、パフォーマンスは重要です。
メッセージがカスタムインターフェイスを実装していて、タイプをチェックして初期化中にしか呼び出せないメソッドがあると思っていましたが、できるだけ簡単なアプローチを探していましたが、 「tは私が宣言されてからclass X : Message<Y>
を防ぐ方法を知りませんが、あなただけのあなたが欲しいものにMessage
サブタイプの使用を制限することができ、ここで
'if(c is ClassA)'? [MSDN](https://msdn.microsoft.com/en-us/library/scekt9xw.aspx) - この例は、探しているパターンと一致するようです。 –
静的コンストラクターでは静的であり、どの型でも呼び出されないため、そのことを知ることはできません。インスタンスコンストラクタでこれを行い、classが自己参照型でない場合は例外をスローするとどうなりますか? – Evk
インスタンスコンストラクタではなく静的コンストラクタで行う必要がある理由を説明できますか? –