2009-07-24 18 views
22

Załóżmy, że mam Type o nazwie type.Ustal, czy typ jest statyczny.

Chcę ustalić, czy mogę to zrobić z mojego typu (bez faktycznie w ten sposób do każdego typu):

Point point1 = new Point(); 

Jednak jeśli type:

Jeśli type jest System.Windows.Point wtedy może to zrobić jest System.Environment to nie będzie latać:

Environment environment1 = new Environment(); //wrong 

Więc jeśli jestem iteracja każdego widoczny typ w zespole, w jaki sposób pomijam wszystkie typy, które nie mogą utworzyć instancji takiej jak druga? Jestem trochę nowy w refleksji, więc nie jestem jeszcze świetny w terminologii. Mam nadzieję, że to, co próbuję tutaj zrobić, jest całkiem jasne.

Odpowiedz

53

static klasy są zadeklarowane jako abstract i sealed na poziomie egzaminu IL. Można więc sprawdzić właściwość IsAbstract, aby obsłużyć zarówno klasy abstract, jak i klasy static za jednym razem (w przypadku użycia).

Jednak klasy abstract nie są jedynymi typami, których nie można bezpośrednio utworzyć. Powinieneś sprawdzić takie rzeczy jak interfejsy (without the CoClass attribute) i typy, które nie mają konstruktora dostępnego przez kod wywołujący.

+3

Dzięki za odpowiedź, zajęłoby mi to dużo czasu, aby wymyślić to na własną rękę. – Beaker

-3

To jest sposób na uzyskanie wszystkich publicznych conttuctors wszystkich typów w zespole.

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

można wyszukać contructors publicznych, takich jak ten,

Lub jeśli interesują Cię tylko bez parametrów konstruktora można użyć

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

Należy zauważyć, że klasa 'abstract' może mieć konstruktor' public'. Nie można utworzyć instancji klasy w treści instrukcji "if". Dostaniesz 'MemberAccessException'. –

+0

Tak, masz rację, zredagowałem post. –

10
type.IsAbstract && type.IsSealed 

Byłoby to wystarczająca kontrola dla języka C#, ponieważ klasa abstrakcyjna nie może być zaplombowana lub statyczna w języku C#. Należy jednak zachować ostrożność podczas pracy z typami CLR z innych języków.

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)); 

Myślę, że to powinno zadziałać.

Powiązane problemy