Việc kê khai implicit
điều hành trong C# cho phép bạn chỉ định:
{type to convert to} ({type to convert from} variablename)
Dưới đây là một ví dụ đơn giản:
class Json
{
private Json(string json)
{
//logic to parse string into object
}
public static implicit operator Json(string input)
{
return new Json(input);
}
}
Một số lưu ý:
Thứ nhất, tôi wouldn' t nhất thiết phải đi theo tuyến đường này, vì hầu hết các đường ing trong ứng dụng của bạn không tương đương ngữ nghĩa với một chuỗi JSON. Mục đích của một nhà điều hành chuyển đổi là để nói hai loại luôn đại diện cho thông tin tương đương ngữ nghĩa (hoặc đủ gần với ngữ nghĩa tương đương để được điều trị một cách hữu ích như vậy). Tôi khuyên bạn nên triển khai static Json Parse(string input)
hoặc thậm chí có thể là phương pháp static bool TryParse(string input, out Json json)
trên lớp Json của bạn. Các callite, nói chung, nên biết liệu nó mong đợi chuỗi riêng của nó để chứa Json.
Thông thường nếu lớp học của tôi cung cấp chuyển đổi loại tiềm ẩn từ một loại, tôi sẽ tìm cách tốt nhất để tạo bất kỳ logic phân tích cú pháp hoặc ctor nào cho cùng loại private
. Điều này đảm bảo chỉ có một cách để người tiêu dùng làm một điều cụ thể, không phải hai cách (ctor và chuyển đổi) - do đó là ctor riêng trong ví dụ trên. Có thể có ngoại lệ cho điều này nhưng đó là một quy tắc chung tốt cho tôi.
Chuyển đổi ngầm cũng cho phép một số điều thú vị với các toán tử so sánh. Ví dụ, bây giờ bạn có thể chuyển đổi hoàn toàn từ chuỗi thành json, bạn cũng có thể làm: if(myJson == "blah")
và nó sẽ thực hiện chuyển đổi và sau đó gọi toán tử ==
trên đối tượng Json của bạn, theo mặc định sẽ thực hiện so sánh bình đẳng tham chiếu.
Nguồn
2011-01-02 19:31:33
Tôi muốn thêm một '.ToJson() 'phương pháp mở rộng thay vì quá tải' hành implicit' từ loại chuyển đổi ngầm vi phạm một số hướng dẫn quan trọng (xem câu trả lời Saeed của). Đặc biệt nó có thể ném, không mất mát và có ngữ nghĩa lạ trong so sánh. – CodesInChaos
@CodeInChaos: Tôi có thể làm cho nó không ném :) Mối quan tâm lớn nhất của tôi ở đây là hành động đơn giản trả về một kiểu khác để phân biệt nó với một chuỗi, mặc dù ngược lại nó có thể hoạt động hoàn hảo như một chuỗi. Bằng cách này tôi biết ContentType nào được đặt mà không cần người dùng phải thực hiện thêm bất kỳ công việc nào (chỉ cần đặt loại trả về của hàm một cách thích hợp). – mpen