2010-11-15 9 views
11

Có cách nào trong C# hoặc .net IL để buộc một lớp có trình khởi tạo kiểu (hàm dựng tĩnh) để tải chính nó, mà không truy cập bất kỳ tham số nào của nó không?Buộc tải lớp

Giả sử tôi đã có lớp

public static class LogInitialization { 
    static LogInitialization() { 
     System.Console.WriteLine("Initialized"); 
    } 
} 

Có cách nào để có được dòng này để in?

Lưu ý rằng lớp này là tĩnh nên tôi không thể khởi tạo lớp đó để bắt đầu khởi tạo và không có thành viên công khai nên tôi không thể truy cập chúng để bắt đầu.

Trả lời

12

lục lọi trong spec CLI, tôi thấy một tham chiếu đến phương pháp RuntimeHelpers.RunClassConstructor

Nếu một ngôn ngữ mong muốn đem lại hành vi cứng nhắc hơn - ví dụ, gõ khởi tự động kích hoạt thực hiện của initializers lớp cơ sở, trong một hàng đầu -to-bottom trật tự - sau đó nó có thể làm như vậy bằng cách:

  • xác định các lĩnh vực tĩnh ẩn và mã trong mỗi constructor lớp đó chạm vào lĩnh vực tĩnh ẩn của các lớp học cơ sở và/hoặc giao diện nó thực hiện, hoặc
  • bằng cách thực hiện các cuộc gọi rõ ràng tới System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor (xem Phân vùng IV).
+2

Để sử dụng điều này, chuyển vào kết quả của thuộc tính 'TypeHandle' trên cá thể' Loại' của bạn. – Sam

7

Tôi thường tạo phương thức Init (trống) trống trên các lớp với các hàm tạo tĩnh để buộc thi hành hàm tạo tĩnh. I E.

public static void Initialize() 
{ 
    // this will force your static constructor to execute, obviously 
} 

Điều đó nói rằng, bạn luôn có thể đi cho Type.TypeInitializer với sự phản ánh ... http://msdn.microsoft.com/en-us/library/system.type.typeinitializer.aspx

EDIT: Một điều khác mà tôi đã làm trong quá khứ, là để tạo ra một thuộc tính gọi là RequiresInitializationAttribute sau đó trên AssemblyLoad quét lắp ráp cho các loại với một thuộc tính như vậy và sử dụng type.TypeInitializer để buộc các constructor tĩnh để thực hiện khi lắp ráp có chứa được nạp.

Tôi đoán câu hỏi thực sự, như thường lệ, là ... bạn đang cố gắng làm gì?

+0

Có, tôi chỉ có thể gọi chính '.cctor' - Tôi không chắc liệu điều đó có ngăn cản CLR gọi lại lần nữa hay không. – configurator

+0

Ngoài ra, hãy gọi kiểu khởi tạo kiểu trên các kiểu tĩnh không thành công! "Không thể tạo một thể hiện của A vì nó là một lớp trừu tượng." Tôi không hiểu tại sao thông điệp đó lại có liên quan, nhưng đó là những gì tôi nhận được. – configurator

+0

Đối với những gì tôi đang cố gắng hoàn thành, tôi về cơ bản biên dịch từ một ngôn ngữ có các quy tắc nghiêm ngặt về thời điểm các lớp cần được tải - vì vậy tôi muốn tải chúng vào đúng thời điểm. – configurator