Tôi có một số mã mà tôi không có quyền kiểm soát. Mã này chấp nhận một tham số đối tượng và cố gắng để bỏ nó vào một loại được biết đến tại thời gian biên dịch như thế này:Chuyển đổi động C# qua nhà điều hành diễn viên
KnownType item = (KnownType) parameter;
Có thể trong C# để thiết kế một lớp tùy chỉnh MyClass
(không bắt nguồn từ KnownType) có thể được thông qua như là tham số vào mã ở trên và được chuyển đổi sang KnownType
bằng đoạn mã trên, với điều kiện là MyClass
có thể chuyển đổi bản thân để KnownType
sử dụng phương pháp thành viên:
protected KnownType ConvertToKnownType()
{
// conversion code goes here
}
tôi đã cố gắng thực hiện một nhà điều hành chuyển đổi tùy chỉnh như thế này:
public static implicit operator KnownType(MyClass source)
{
KnownType result;
// conversion goes here
return result;
}
nhưng không hoạt động (không được sử dụng). Tôi có quyền giả định rằng toán tử cast chỉ hoạt động khi kiểu nguồn, kiểu đích và toán tử chuyển đổi được biết tại thời gian biên dịch? Ban đầu tôi đã không cung cấp thêm chi tiết về mã thực hiện chuyển đổi bởi vì tôi cho rằng nó không liên quan và vì tôi chủ yếu quan tâm đến cách nhà điều hành diễn viên được triển khai, tức là nó xem xét thời gian chạy loại để tìm một công cụ chuyển đổi thích hợp hoặc là quyết định được thực hiện tại thời gian biên dịch?
Để xóa mọi thứ, KnownType
thực tế là DataRowView
, trong khi MyClass
là lớp bao bọc cho DataRowView
phải lấy được từ một số loại khác. MyClass
giữ tham chiếu đến DataRowView
. Thay vì ràng buộc ComboBox.DataSource
thành DataView
, tôi liên kết nó với một số IList<MyClass>
nhưng tôi vẫn cần ComboBox
để có thể truy cập các giá trị cột DataRowView
như thể tôi đã ràng buộc một IList<DataRowView>
. Thật không may, toán tử cast hoạt động theo cách tôi sợ: nó chỉ tính đến thông tin kiểu thời gian biên dịch để thực hiện chuyển đổi (tuy nhiên nó sử dụng thông tin kiểu thời gian chạy khi đúc giữa các kiểu trong cùng một cây thừa kế).
Tại sao bạn không chỉ tạo 'MyType' với hàm trả về phiên bản' KnownType' được tạo dựa trên các thuộc tính của cá thể 'MyType'? Sau đó, bạn có thể chuyển 'myType.ToKnownType()' cho hàm mong đợi 'KnownType'. – xxbbcc
@xxbbcc Anh ấy nói anh ấy không có quyền kiểm soát lớp học đang thực hiện chuyển đổi. – Servy
Nó cũng phụ thuộc vào chính xác mã đang làm gì để kiểm tra đối tượng bạn truyền vào. Có thể kiểm tra rõ ràng rằng đối tượng là loại chính xác và thậm chí không phải là một đối tượng được kế thừa từ nó. – DavidG