2010-03-04 36 views
8

Vì C# thiếu hỗ trợ cho các chức năng tự do, tôi thấy khó tìm một nơi để đặt các chức năng chuyển đổi. Ví dụ, tôi muốn chuyển đổi một enum thành một số. Trong C++, tôi sẽ thực hiện chức năng freestanding sau đây cho điều này:Nơi đặt chức năng chuyển đổi?

UINT32 ConvertToUint32(const MyEnum e); 

Làm cách nào để tôi có thể thực hiện điều này một cách thanh lịch trong C#? Tôi có nên tạo một lớp tĩnh giả để giữ chức năng không, và nếu có, làm cách nào để tìm một tên có ý nghĩa cho nó? Hoặc tôi có nên thực hiện chuyển đổi một phần không?

Bất kỳ ý tưởng nào?

Xin cảm ơn trước.

Cập nhật: Nhìn lại, ví dụ của tôi không được chọn rất tốt vì có tồn tại chuyển đổi mặc định giữa enum và int. Đây sẽ là một ví dụ tốt hơn:

Person ConvertToPerson(const SpecialPersonsEnum e); 
+1

MyEnum e = (MyEnum) 3; hoặc MyInt i = (Int) e; là cả hai cách chấp nhận được để chuyển đổi giữa int và enum trong C#.Điều đó đang được nói, tôi luôn đặt chức năng chuyển đổi của tôi trong một lớp tiện ích. – jle

+0

+1 'một phần lớp Convert' là ý tưởng tốt. –

+3

Nếu bạn muốn chuyển đổi từ một enum thành một lớp Person thì ** viết toán tử chuyển đổi **. Tại sao lộn xộn xung quanh với một phương pháp khi bạn chỉ có thể viết một nhà điều hành mà làm những gì bạn muốn? –

Trả lời

8

Tôi muốn đi với:

namespace ExtensionMethods 
{ 
    public static class MyExtensions 
    { 
     public static int ConvertToInt(this MyEnum e) 
     { 
      var m; 

      // ... Implementation 

      return m; 
     } 
    } 
} 

Sau đó, bạn sẽ chỉ cần sử dụng MyEnum.ConvertToInt(); Cùng thể được thực hiện cho nhiều chuyển đổi tất cả từ trong cùng một lớp. Phương pháp mở rộng là tóm lại, khêu gợi sexy.


Ngoài ra, Eric's nhận xét về Trình chuyển đổi loại đã giúp tôi googling. Khá tuyệt vời, tuy nhiên tôi không chắc chắn làm thế nào để sử dụng chúng với một Enum, nhưng đối với các chuyển đổi khác, chúng được sạch sẽ như một tiếng còi để thực hiện. Có một cái nhìn ở đây:

+0

Cảm ơn ví dụ. –

1

tôi muốn giới thiệu mà bạn tạo và lắp ráp mà sẽ chứa tất cả các bạn phương pháp helper/hằng số và enums sẽ được sử dụng trong các dự án khác.

Điều này sẽ cho phép bạn dễ dàng bao gồm hội đồng này với các hội đồng khác cần nó và tránh tham chiếu vòng tròn.

9

Ví dụ trên trông giống như một ứng viên cho Phương thức tiện ích mở rộng.
Nếu điều đó là không thể, tôi định nghĩa chúng là các phương thức tĩnh trong một lớp tĩnh; Tôi thường đặt chúng trong một lớp tĩnh gọi là XXXHelper

+0

Trong trường hợp cụ thể này, một diễn viên sẽ ổn, trong trường hợp chung tôi đồng ý với Gishu và cố gắng sử dụng các phương pháp mở rộng trước khi sinh ra một lớp "trợ giúp". Giữ chức năng ở gần vị trí mà nó thuộc về nhất có thể (trong khi vẫn duy trì SRP của khóa học). –

+0

Bạn nói đúng! Tôi không mong đợi phương pháp mở rộng để làm việc trên bảng liệt kê, nhưng dường như họ làm. –

1

Bạn không thể sử dụng dàn diễn viên cho điều này? (UInt32)e. Hoặc nếu không gọi Convert.ToUInt32(e)

+0

Có, nhưng tôi đang nói về trường hợp chung. Ví dụ của tôi chỉ đơn thuần là làm cho tình hình rõ ràng. –

1

Ý tưởng của việc tạo ra một "lớp dummy" tĩnh có vẻ là những gì mà Microsoft đề nghị:

http://msdn.microsoft.com/en-us/library/bb383974.aspx

Tôi nghĩ rằng trong ví dụ cụ thể của bạn làm một lớp Chuyển đổi một phần làm cho ý nghĩa nhất.

0

tôi phải đối mặt với vấn đề tương tự một lần và tôi đã làm điều này

class Program 
{ 
    static void Main(string[] args) 
    { 
     string s = "123"; 
     int n = Convert.StringToInt(s); 
    } 
} 

class Convert 
{ 

    public static int StringToInt(string s) 
    { 
     // implementation 
    } 
    public static string IntToString(int n) 
    { 
     // implementation 
    } 
} 
+2

cho điều đó ... tại sao bạn sử dụng lớp System.Convert .Net? – SysAdmin

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