2010-05-25 20 views
5

Tôi đã nhìn thấy nhiều câu hỏi và câu trả lời về việc ánh xạ chuỗi tới enums và ngược lại, nhưng làm thế nào tôi có thể ánh xạ một chuỗi các chuỗi được bản địa hóa thành các enums?Làm cách nào để quốc tế hóa các chuỗi đại diện cho các giá trị enum C#?

Tôi có nên tạo một extension method like this trả về chuỗi thích hợp từ tệp tài nguyên không? Có cách nào để bản địa hóa các thuộc tính (như "Mô tả") được sử dụng trong solutions like this không?

Giải pháp được ưu tiên - phương pháp hoặc thuộc tính mở rộng. Dường như với tôi rằng đây không phải là mục đích của các thuộc tính. Trong thực tế, bây giờ tôi nghĩ về nó, nếu tôi sử dụng một phương thức mở rộng, một thuộc tính có vẻ như cái gì đó tôi muốn sử dụng để chỉ định một khóa trong một tệp tài nguyên cho chuỗi đã bản địa hóa mà tôi muốn sử dụng thay cho giá trị enum.

EDIT - ví dụ:

Với enum sau,

public enum TransactionTypes { 
    Cheque = 1, 
    BankTransfer = 2, 
    CreditCard = 3 
} 

Tôi muốn một cách để ánh xạ từng loại thành một chuỗi cục bộ. Tôi bắt đầu với một phương thức mở rộng cho enum sử dụng một câu lệnh switch và các tham chiếu mạnh mẽ được nhập vào tệp tài nguyên.

Tuy nhiên, một phương pháp mở rộng cho mọi enum dường như không phải là một giải pháp tuyệt vời. Tôi đã bắt đầu theo dõi this để tạo thuộc tính tùy chỉnh cho từng giá trị được liệt kê. Thuộc tính có tên cơ sở và khóa cho tệp tài nguyên chứa chuỗi được bản địa hóa. Trong ví dụ trên, ví dụ, tôi có điều này:

... 
[EnumResourceAttribute("FinancialTransaction", "Cheque")] 
Cheque = 1, 
... 

Trong trường hợp "FinanacialTransaction" là tệp resx và "Kiểm tra" là khóa chuỗi. Tôi đang cố gắng tạo một phương thức tiện ích mà tôi có thể chuyển bất kỳ giá trị nào từ bất kỳ kiểu liệt kê nào và nó trả về biểu diễn chuỗi cục bộ của giá trị đó, giả định thuộc tính tùy chỉnh được chỉ định. Tôi chỉ không thể tìm ra cách để truy cập động một tệp tài nguyên và một khóa trong đó.

Trả lời

2

tôi tiếp tục với các thuộc tính tùy chỉnh và tạo ra phương pháp này tiện ích:

public static string getEnumResourceString(Enum value) 
    { 
     System.Reflection.FieldInfo fi = value.GetType().GetField(value.ToString()); 
     EnumResourceAttribute attr = (EnumResourceAttribute)System.Attribute.GetCustomAttribute(fi, typeof(EnumResourceAttribute)); 
     return (string)HttpContext.GetGlobalResourceObject(attr.BaseName, attr.Key); 
    } 
8

Tôi chắc chắn sẽ đề xuất sử dụng tệp tài nguyên, có thể với phương thức (tiện ích mở rộng hoặc cách khác) để đơn giản hóa việc nắm giữ tài nguyên có liên quan. Vì số lượng ngôn ngữ bạn hỗ trợ phát triển, bạn không thực sự muốn mã đầy văn bản, làm bạn mất tập trung từ các giá trị.

Tương tự như vậy các công ty dịch thuật đều có khả năng được hướng lên để xử lý các file resx - họ sẽ không muốn lộn xộn xung quanh trong mã nguồn của bạn, và bạn không nên để họ làm như vậy anyway :)

Just sử dụng các nguồn tài nguyên được khóa trên tên của enum và giá trị bên trong nó. Đơn giản, quy mô cho nhiều enums và nhiều ngôn ngữ, không lộn xộn lên mã nguồn của bạn, hoạt động tốt với các công cụ dịch thuật, và về cơ bản là đi cùng với luồng i18n bên trong .NET.

EDIT: Đối với việc lập bản đồ các giá trị enum để tên tài nguyên, tôi chỉ muốn làm điều gì đó như:

public static string ToResourceName<T>(this T value) where T : struct 
{ 
    return typeof(T).Name + "." + value; 
} 

Sau đó, bạn có thể làm:

string resource = MyEnum.SomeValue.ToResourceName(); 

Rõ ràng đó là thực hiện nối chuỗi mỗi lần - bạn có thể bộ nhớ cache mà nếu bạn muốn, nhưng tôi sẽ không bận tâm trừ khi bạn có một số dấu hiệu cho thấy đó thực sự là một vấn đề.

Điều đó không ngăn bạn sử dụng phương pháp mở rộng cho những người không có enums, tất nhiên. Nếu bạn muốn làm điều đó, bạn cần một cái gì đó như Unconstrained Melody.

+0

+1 Tôi là 1 phút quá muộn :) –

+0

tôi cần phải có được rõ ràng hơn - Tôi sẽ không sử dụng bất cứ điều gì khác hơn các tệp tài nguyên (chúng tôi đã sử dụng chúng cho mọi thứ khác cần i18n). Tôi đang tìm các giải pháp để lập bản đồ các chuỗi tài nguyên để liệt kê. – Matt

+0

@Duke: Được rồi, nó không phải là quá rõ ràng những gì bạn muốn sau đó - Tôi đã cập nhật câu trả lời của tôi với một phương pháp mở rộng rất đơn giản, nhưng tôi nghi ngờ bạn sau một cái gì đó nhiều hơn ... –

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