System.Reflection.Emit.TypeBuilder sınıfı

Uyarı

Bu makale, bu API'nin başvuru belgelerine ek açıklamalar sağlar.

TypeBuilder , çalışma zamanında dinamik sınıfların oluşturulmasını denetlemek için kullanılan kök sınıftır. Sınıfları tanımlamak, yöntemler ve alanlar eklemek ve bir modülün içinde sınıfı oluşturmak için kullanılan bir dizi yordam sağlar. Dinamik bir modülden TypeBuilder oluşturmak için ModuleBuilder.DefineType yöntemini çağırabilir ve bu da bir TypeBuilder nesnesi döndürür.

Yansıma yayma, türleri tanımlamak için aşağıdaki seçenekleri sağlar:

  • Verilen ada sahip bir sınıf veya arabirim tanımlayın.
  • Verilen ad ve özniteliklerle bir sınıf veya arabirim tanımlayın.
  • Verilen ada, özniteliklere ve temel sınıfa sahip bir sınıf tanımlayın.
  • Verilen ada, özniteliklere, temel sınıfa ve sınıfın uyguladığı arabirim kümesine sahip bir sınıf tanımlayın.
  • Verilen adla, özniteliklerle, temel sınıfla ve paketleme boyutuyla bir sınıf tanımlayın.
  • Verilen isim, öznitelikler, temel sınıf ve sınıfın toplam boyutu ile bir sınıf tanımlayın.
  • Verilen isim, öznitelikler, temel sınıf, paketleme boyutu ve genel sınıf boyutuyla bir sınıf tanımlayın.

Tamamlanmamış bir türü temsil eden bir TypeBuilder nesnesi için bir dizi türü, işaretçi türü veya byref türü oluşturmak amacıyla sırasıyla MakeArrayType yöntemini, MakePointerType yöntemini veya MakeByRefType yöntemini kullanın.

Bir tür kullanılmadan önce TypeBuilder.CreateType yöntemi çağrılmalıdır. CreateType , türün oluşturulmasını tamamlar. CreateType çağrısının ardından, çağıran Activator.CreateInstance yöntemini kullanarak türün bir örneğini oluşturabilir ve Type.InvokeMember yöntemini kullanarak türün üyelerini çağırabilir. CreateType çağrıldıktan sonra bir türün uygulamasını değiştiren yöntemleri çağırmak bir hatadır. Örneğin, ortak dil çalışma zamanı, çağıran bir türe yeni üyeler eklemeye çalışırsa bir istisna fırlatır.

Bir sınıf başlatıcı yöntemi kullanılarak TypeBuilder.DefineTypeInitializer oluşturulur. DefineTypeInitializer bir ConstructorBuilder nesne döndürür.

İç içe türler, TypeBuilder.DefineNestedType yöntemlerinden biri çağrılarak tanımlanır.

Özellikler

TypeBuilder sınıfı, oluşturulacak türün özelliklerini daha ayrıntılı şekilde belirtmek için TypeAttributes enum sınıflandırmasını kullanır.

  • Arabirimler TypeAttributes.Interface ve TypeAttributes.Abstract öznitelikleri kullanılarak belirtilir.
  • Somut sınıflar (genişletilemeyen sınıflar) özniteliği kullanılarak TypeAttributes.Sealed belirtilir.
  • Çeşitli öznitelikler tür görünürlüğünü belirler. Numaralandırmanın açıklamasına TypeAttributes bakın.
  • Belirtilirse TypeAttributes.SequentialLayout , sınıf yükleyicisi alanları meta verilerden okunma sırasına göre düzenler. Sınıf yükleyicisi belirtilen paketleme boyutunu dikkate alır, ancak belirtilen alan uzaklıklarını yoksayar. Meta veriler, alan tanımlarının yayıldığı sırayı korur. Birleştirme işleminde bile meta veriler alan tanımlarını yeniden sıralamaz. Yükleyici, TypeAttributes.ExplicitLayout belirtilirse yalnızca belirtilen alan kaydırmalarını kabul eder.

Bilinen sorunlar

  • Yansıma yayma, bir arabirim uygulayan soyut olmayan bir sınıfın arabirimde bildirilen tüm yöntemleri uygulayıp uygulamadığını doğrulamaz. Ancak, sınıf bir arabirimde bildirilen tüm yöntemleri uygulamazsa, çalışma zamanı sınıfını yüklemez.
  • Her ne kadar TypeBuilder öğesi Type öğesinden türetilmiş olsa da, Type sınıfında tanımlanan soyut yöntemlerden bazıları TypeBuilder sınıfında tam olarak uygulanmamıştır. Bu TypeBuilder yöntemlere yapılan çağrılar bir NotSupportedException özel durum oluşturur. İstenen işlevsellik, oluşturulan türün Type.GetType veya Assembly.GetType kullanılarak alınması ve alınan türe yansıtılması ile elde edilebilir.