Có ai biết nếu nó có thể xác định tương đương với "trình nạp lớp tùy chỉnh java" trong .NET không?Tương đương với Trình nạp Lớp trong .NET
Để cung cấp cho một chút nền:
Tôi đang trong quá trình phát triển một ngôn ngữ lập trình mới mà mục tiêu CLR, được gọi là "Liberty". Một trong những tính năng của ngôn ngữ là khả năng xác định "các hàm tạo kiểu", là các phương thức được trình biên dịch thực thi tại thời gian biên dịch và tạo ra các kiểu làm đầu ra. Họ là loại một sự tổng quát của generics (ngôn ngữ không có Generics bình thường trong nó), và cho phép mã như thế này phải được viết (trong "Liberty" cú pháp):
var t as tuple<i as int, j as int, k as int>;
t.i = 2;
t.j = 4;
t.k = 5;
đâu "tuple" được định nghĩa như vậy :
public type tuple(params variables as VariableDeclaration[]) as TypeDeclaration
{
//...
}
Trong ví dụ cụ thể này, trình tạo kiểu tuple
cung cấp một cái gì đó tương tự như loại ẩn danh trong VB và C#.
Tuy nhiên, không giống như các loại ẩn danh, "bộ dữ liệu" có tên và có thể được sử dụng bên trong chữ ký phương thức công khai.
Điều này có nghĩa là tôi cần một cách cho loại cuối cùng kết thúc được phát ra bởi trình biên dịch để có thể chia sẻ trên nhiều cụm. Ví dụ, tôi muốn
tuple<x as int>
quy định tại hội A đến kết thúc là loại giống như tuple<x as int>
quy định tại hội B.
Vấn đề với điều này, tất nhiên, là hội A và B hội sẽ được biên dịch vào các thời điểm khác nhau, điều đó có nghĩa là cả hai đều sẽ phát ra các phiên bản không tương thích của riêng kiểu tuple.
Tôi nhìn vào sử dụng một số loại "loại tẩy xoá" để làm điều này, vì vậy mà tôi sẽ có một thư viện chia sẻ với một loạt các loại như thế này (là "Liberty" cú pháp này):
class tuple<T>
{
public Field1 as T;
}
class tuple<T, R>
{
public Field2 as T;
public Field2 as R;
}
và sau đó chỉ chuyển hướng truy cập từ các trường i, j và k tới Field1
, Field2
và Field3
.
Tuy nhiên đó không thực sự là một lựa chọn khả thi. Điều này có nghĩa là tại thời điểm biên dịch tuple<x as int>
và tuple<y as int>
sẽ kết thúc là các loại khác nhau, trong khi thời gian chạy chúng sẽ được coi là cùng loại. Điều đó sẽ gây ra nhiều vấn đề cho những thứ như bình đẳng và nhận dạng loại. Đó là quá rò rỉ của một trừu tượng cho thị hiếu của tôi.
Các tùy chọn có thể khác sẽ là sử dụng "đối tượng túi trạng thái". Tuy nhiên, bằng cách sử dụng một túi nhà nước sẽ đánh bại toàn bộ mục đích của việc có hỗ trợ cho "loại nhà thầu" trong ngôn ngữ. Ý tưởng có để cho phép "mở rộng ngôn ngữ tùy chỉnh" để tạo ra các loại mới tại thời gian biên dịch mà trình biên dịch có thể làm kiểm tra kiểu tĩnh với.
Trong Java, điều này có thể được thực hiện bằng cách sử dụng trình tải lớp tùy chỉnh. Về cơ bản, mã sử dụng các loại tuple có thể được phát ra mà không thực sự xác định loại trên đĩa. Sau đó, một trình nạp lớp "tùy chỉnh" có thể được định nghĩa sẽ tự động tạo kiểu tuple khi chạy. Điều đó sẽ cho phép kiểm tra kiểu tĩnh bên trong trình biên dịch, và sẽ thống nhất các kiểu tuple trên các biên dịch biên dịch.
Thật không may, tuy nhiên, CLR không cung cấp hỗ trợ cho việc tải lớp tùy chỉnh.Tất cả tải trong CLR được thực hiện ở cấp độ lắp ráp. Có thể định nghĩa một assembly riêng biệt cho mỗi "kiểu xây dựng", nhưng điều đó sẽ dẫn đến các vấn đề hiệu suất rất nhanh (có nhiều assembly chỉ có một loại trong chúng sẽ sử dụng quá nhiều tài nguyên).
Vì vậy, những gì tôi muốn biết là:
Có thể mô phỏng một cái gì đó như Java Class xúc lật trong .NET, nơi tôi có thể phát ra một tham chiếu đến một loại không tồn tại trong và sau đó tự động tạo một tham chiếu đến kiểu đó khi chạy trước mã mà nhu cầu sử dụng nó chạy?
LƯU Ý:
* Tôi thực sự đã biết câu trả lời cho câu hỏi, mà tôi cung cấp như một câu trả lời dưới đây. Tuy nhiên, nó đã cho tôi khoảng 3 ngày nghiên cứu, và khá một chút của IL hacking để đến với một giải pháp. Tôi nghĩ rằng nó sẽ là một ý tưởng tốt để tài liệu nó ở đây trong trường hợp bất cứ ai khác chạy vào cùng một vấn đề. *
Oh wow, bài đăng đầu tiên tôi từng nghĩ nên có tiêu đề Chương. Thông tin tuyệt vời! Cảm ơn vì đăng! –