2016-09-15 23 views
7

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ế).

+1

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

+0

@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

+0

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

Trả lời

6

Không, không thể thực hiện được. Dàn diễn viên được cung cấp sẽ chỉ chỉ thành công nếu bạn có thể lấy được lớp học của mình từ lớp đó. Bất kỳ loại chuyển đổi nào không dựa trên thừa kế sẽ yêu cầu lớp thực hiện chuyển đổi để làm điều gì đó khác với những gì nó đang làm.

Tôi có quyền giả định rằng toán tử truyền có hoạt động khi biết loại nguồn, loại mục tiêu và toán tử chuyển đổi không?

Có.

+0

Lưu ý rằng nếu 'KnownType' là một giao diện * (hoặc một kiểu có nguồn gốc từ' MarshalByRefObject'), bạn có thể sử dụng chức năng chuyển đổi tùy chỉnh bằng cách cung cấp proxy trong suốt như 'tham số' (mà bạn có thể lấy 'RealProxy' thực hiện). –

Các vấn đề liên quan