Frage Verwenden Sie reflection, um eine Liste der statischen Klassen zu erhalten


viele Fragen liegen nahe, aber keine beantwortet mein Problem ...

Wie verwende ich Reflektion in C # 3.5, um alle Klassen zu erhalten, die von einer Baugruppe statisch sind. Ich habe bereits alle Typen definiert, aber es gibt keine IsStatic-Eigenschaft. Das Zählen von 0 Konstruktoren ist sehr langsam und hat auch nicht funktioniert.

Irgendwelche Tipps oder eine Codezeile? :-)

Chris


6
2018-04-14 17:06


Ursprung


Antworten:


So erhalten Sie Typen aus einer Baugruppe:

http://msdn.microsoft.com/en-us/library/system.reflection.assembly.aspx

GetTypes-Methode

Dann:

Suchen Sie nach den Klassen, die gleichzeitig abstrakt und versiegelt sind.

http://dotneteers.net/blogs/divedeeper/archive/2008/08/04/QueryStaticClasses.aspx

Wenn ich in Blogs blicke, könnte ich die Information finden, dass .NET CLR die Idee von statischen Klassen nicht kennt, erlaubt aber die Verwendung der abstrakten und versiegelten Typenflags gleichzeitig. Diese Flags werden auch von der CLR verwendet, um ihr Verhalten zu optimieren. Beispielsweise wird das versiegelte Flag verwendet, um virtuelle Methoden der versiegelten Klasse wie Nicht-virtuelle aufzurufen.   Um zu fragen, ob ein Typ statisch ist oder nicht, können Sie diese Methode verwenden:

Aus dem Kommentar unten:

IEnumerable<Type> types = typeof(Foo).Assembly.GetTypes().Where
(t => t.IsClass && t.IsSealed && t.IsAbstract);

13
2018-04-14 17:10



Was C # eine statische Klasse nennt, ist eine abstrakte, versiegelte Klasse für die CLR. Sie müssten also auf IsAbstract && IsSealed schauen.


3
2018-04-14 17:11



Statische Klassen sind ein Merkmal von C #, nicht die Common Language Specification, und daher gibt es keine einzelnen Metadaten in einer Type-Instanz, die anzeigen würden, dass es sich um eine statische Klasse handelt. Sie können jedoch überprüfen, ob es sich um einen versiegelten Typ handelt und ob alle nicht geerbten Elemente statisch sind.


1
2018-04-14 17:09



Sie müssen folgende Überprüfungen kombinieren: Abstract, Sealed, BeforeFieldInit. Nach dem Kompilieren statischer Klassen können Sie folgenden IL-Code in der kompilierten Assembly sehen:

.class public abstract auto ansi sealed beforefieldinit StaticClass
    extends [mscorlib]System.Object
{
}

1
2018-04-14 17:14