37

Typeとしましょうtype

私は自分のタイプでこれを行うことができるかどうかを判断したい(実際に各タイプに対してこれを行うことなく):

もしそうなら、私typeSystem.Windows.Pointこれを行うことができます:

Point point1 = new Point();

ただし、 の場合、これtypeSystem.Environment飛ばない:

Environment environment1 = new Environment(); //wrong

では、アセンブリ内のすべての可視型を反復処理している場合、2 番目のようなインスタンスの作成に失敗するすべての型をスキップするにはどうすればよいでしょうか? 私はリフレクションに慣れていないので、用語についてはまだそれほど得意ではありません。うまくいけば、私がここでやろうとしていることはかなり明確です。

4

5 に答える 5

85

staticクラスはIL レベルで宣言abstractされます。そのため、プロパティをsealedチェックして、クラスとクラスの両方を一度に処理できます(ユースケース用)。IsAbstractabstractstatic

ただし、abstract直接インスタンス化できない型はクラスだけではありません。インターフェイス ( attributeなしCoClass) や、呼び出し元のコードからアクセスできるコンストラクターを持たない型などを確認する必要があります。

于 2009-07-24T05:50:32.683 に答える
23
type.IsAbstract && type.IsSealed

抽象クラスはC#でシールまたは静的にすることができないため、これはC#の十分なチェックになります。ただし、他の言語のCLRタイプを処理する場合は注意が必要です。

于 2009-07-24T06:05:55.960 に答える
7

このようにパブリック コンストラクターを検索できます。

Type t = typeof(Environment);
var c = t.GetConstructors(BindingFlags.Public);
if (!t.IsAbstract && c.Length > 0)
{
     //You can create instance
}

または、パラメーターなしのコンストラクターのみに関心がある場合は、使用できます

Type t = typeof(Environment);
var c = t.GetConstructor(Type.EmptyTypes);
if (c != null && c.IsPublic && !t.IsAbstract )
{
     //You can create instance
}
于 2009-07-24T05:56:57.193 に答える
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));

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

于 2009-07-24T07:26:43.767 に答える
-4

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

    var assembly = AppDomain.CurrentDomain.GetAssemblies()[0]; // first assembly for demo purposes
var types = assembly.GetTypes();
foreach (var type in types)
{
    var constructors = type.GetConstructors();
}
于 2009-07-24T05:54:53.563 に答える