2012-04-17 32 views
10

System.Convert có một tiện ích thực sự hữu ích để chuyển đổi kiểu dữ liệu từ kiểu này sang kiểu khác. Trong dự án của tôi, tôi có nhiều loại tùy chỉnh. Tôi muốn chuyển đổi các đối số dòng lệnh thành các kiểu tùy chỉnh này (một số trong số đó là khá phức tạp). Nó sẽ là tốt đẹp nếu những tồn tại trong System.Convert vì vậy tôi chỉ có thể làm một cái gì đó như thế này:Mở rộng System.Convert

Convert.ToMyCustomType(args[1]) 

Tôi muốn điều này hiển thị trong Visual C# IDE khi tôi gõ. Tôi biết rằng tôi có thể chỉ đơn giản là tạo ra một thói quen để chuyển đổi các loại nhưng tôi muốn các loại chuyển đổi được xử lý theo cách tương tự như những gì đã được xây dựng trong khuôn khổ. Có ai đã thành công trong việc này không?

+1

Điều gì sẽ mang đến cho bạn nhiều phương pháp mở rộng? – Oded

+1

@Oded: Chuyển đổi là một lớp tĩnh. –

+0

@JonSkeet - Tất nhiên là ... không suy nghĩ. – Oded

Trả lời

14

Không, bạn không thể thêm chúng vào lớp Convert - Tôi sẽ đề nghị thêm các phương pháp chuyển đổi sang các loại thực tế của bạn, chẳng hạn như:

MyCustomType.FromInt32(...) 

và phương pháp dụ đi theo cách khác:

int x = myCustomType.ToInt32(); 

(phương pháp nhà máy tĩnh thường tốt hơn so với thêm nhiều nhà xây dựng quá tải, IMO. Chúng cho phép nhiều lựa chọn thay thế - bao gồm trả về giá trị rỗng khi thích hợp hoặc bộ nhớ đệm - và có thể làm cho mã gọi rõ ràng hơn.)

Tôi cũng khuyên bạn không vượt quá số lượng chuyển đổi bạn cung cấp. Không có nhiều loại tùy chỉnh thực sự có một chuyển đổi tự nhiên từ tất cả các loại nguyên thủy.

+1

Điều này có lẽ sẽ là điều tốt nhất tiếp theo. Cảm ơn! –

2

Đầu tiên, System.Convert không phải là không gian tên; nó là một lớp tĩnh (xem documentation để biết thêm thông tin). Bạn có thể viết lớp chuyển đổi của riêng bạn!

static class Convert 
{ 
    static MyCustomType ToMyCustomType(string value) 
    { 
     //logic here... 
    } 
} 

Nếu bạn muốn sử dụng lớp này trong cùng một tệp nơi bạn đang sử dụng System.Convert, bạn có thể muốn đặt tên cho một tên khác để giảm sự mơ hồ.

3

Thật không may System.Convert là lớp tĩnh và bạn không thể mở rộng các lớp tĩnh. Bạn chỉ có thể lấy được các lớp tĩnh từ object.


Một cách tốt để đi, là cung cấp cho các nhà khai thác chuyển đổi (hoặc ngầm hoặc rõ ràng)

public class MyClass 
{ 
    public static explicit operator MyClass(SomeOtherType other) 
    { 
     return new MyClass { /* TODO: provide a conversion here*/ }; 
    } 

    public static explicit operator SomeOtherType(MyClass x) 
    { 
     return new SomeOtherType { /* TODO: provide a conversion here*/ }; 
    } 
} 

Với tuyên bố này, bạn có thể làm điều này

MyClass myClass = new MyClass(); 
SomeOtherType other = (SomeOtherType)myClass; 

hay này

SomeOtherType other = new SomeOtherType(); 
MyClass myClass = (MyClass)other; 
0

Convert là một lớp tĩnh, mà bạn không thể mở rộng.

Tuy nhiên, bạn có thể sử dụng Convert.ChangeType() cho các nhu cầu của mình.