2011-01-02 34 views
9

Với một số mã như thế này:Làm cách nào để cho phép chuyển đổi ngầm?

class Json 
{ 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
    } 

    Json MyAction() 
    { 
     return "{\"json\": 1}"; 
    } 
} 

Có cách nào tôi có thể thêm vào các lớp Json để làm điều này biên dịch? Một cái gì đó để cho trình biên dịch biết rằng nó có thể ngầm đưa một chuỗi vào một Json?

+1

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

+0

@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

Trả lời

27

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.

+0

Sẽ chấp nhận sau ~ 12 phút. Không biết có một từ khóa 'ngầm 'cho loại điều này .. cool :) – mpen

4

Thêm một nhà điều hành implicit:

public static implicit operator Json(string s) 
{ 
    return new Json(s); 
} 

Từ khóa ngầm được sử dụng để khai báo một nhà điều hành loại chuyển đổi người dùng định nghĩa tiềm ẩn. Sử dụng nó để bật chuyển đổi tiềm ẩn giữa loại do người dùng xác định và loại khác, nếu chuyển đổi được đảm bảo không làm mất dữ liệu.

3

Bạn có thể có một bộ chuyển đổi ngầm nhưng chăm sóc bạn không bị mất dữ liệu:

Bằng cách loại bỏ phôi không cần thiết, chuyển đổi tiềm ẩn có thể cải thiện mã dễ đọc nguồn. Tuy nhiên, vì chuyển đổi tiềm ẩn có thể xảy ra mà không có quy định cụ thể của nhà lập trình , hãy cẩn thận để ngăn chặn những điều bất ngờ khó chịu.Nói chung, nhà điều hành chuyển đổi tiềm ẩn phải không bao giờ ném ngoại lệ và không bao giờ mất thông tin để chúng có thể được sử dụng một cách an toàn mà không có sự nhận thức của của lập trình viên. Nếu nhà điều hành chuyển đổi không thể đáp ứng các tiêu chí đó, cần được đánh dấu là khiêu dâm.

thấy MSDN

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