2009-07-24 18 views
22

と呼ばれるTypeがあるとします。タイプがスタティックであるかどうかを確認

私は(実際には、各タイプにこれをやってなくて)私のタイプでこれを行うことができるかどうかを決定します:

typeSystem.Windows.Pointであれば、私はこれを行うことができます:ただし

Point point1 = new Point(); 

typeSystem.Environmentの場合、これは飛ばない:

Environment environment1 = new Environment(); //wrong 

だから私は毎回繰り返すアセンブリ内の可視タイプ2番目のインスタンスのようにインスタンスを作成できないすべての型をスキップするにはどうすればよいですか?私はリフレクションに慣れていないので、この用語ではそれほど偉大ではありません。うまくいけば私がここでやろうとしていることはかなり明確です。

答えて

53

staticクラスは、ILレベルでabstractおよびsealedと宣言されています。したがって、IsAbstractのプロパティをチェックして、abstractクラスとstaticクラスを1回で処理できます(ユースケースの場合)。

しかし、abstractクラスは、直接インスタンス化できないタイプではありません。あなたは、インターフェイス(without the CoClass attribute)、および呼び出しコードによってアクセス可能なコンストラクタを持たない型のようなものをチェックするべきです。

+3

答えをいただきありがとうございます。これは私自身でこれを考え出すには長い時間がかかりました。 – Beaker

-3

これは、アセンブリ内のすべてのタイプのパブリックコンストラクタをすべて取得する方法です。

var assembly = AppDomain.CurrentDomain.GetAssemblies()[0]; // first assembly for demo purposes 
var types = assembly.GetTypes(); 
foreach (var type in types) 
{ 
    var constructors = type.GetConstructors(); 
} 
6
あなたは、このような公共contructorsを検索することができ

それとも、パラメータなしのコンストラクタにしか興味あなたが

Type t = typeof(Environment); 
var c = t.GetConstructor(Type.EmptyTypes); 
if (c != null && c.IsPublic && !t.IsAbstract) 
{ 
    //You can create instance 
} 
+2

'abstract'クラスは' public'コンストラクタを持つことができます。 'if'文の本文に必ずクラスのインスタンスを作成することはできません。あなたは 'MemberAccessException'を取得します。 –

+0

いや、あなたは正しいです、私は投稿を編集しました。 –

10
type.IsAbstract && type.IsSealed 

を使用することができる場合、これは十分なチェックになります抽象クラスはC#で密封または静的にすることができないので、C#のために。ただし、他の言語のCLR型を扱う場合は注意が必要です。

1
Type t = typeof(System.GC); 
Console.WriteLine(t.Attributes); 
TypeAttributes attribForStaticClass = TypeAttributes.AutoLayout | TypeAttributes.AnsiClass | TypeAttributes.Class | 
TypeAttributes.Public | TypeAttributes.Abstract | TypeAttributes.Sealed | TypeAttributes.BeforeFieldInit; 
Console.WriteLine((t.Attributes == attribForStaticClass)); 

これはうまくいくはずです。

関連する問題