2008-09-02 32 views
6

Tôi tưởng tượng tất cả mọi người đã nhìn thấy mã như:Sử dụng thuộc tính cắt giảm enum để lập bản đồ enum và enum/const để statments tắc hành động

public void Server2ClientEnumConvert(ServerEnum server) 
{ 
    switch(server) 
    { 
     case ServerEnum.One: 
      return ClientEnum.ABC 
     //And so on. 

Thay vì badness này, chúng ta có thể làm somthing như:

public enum ServerEnum 
{ 
    [Enum2Enum(ClientEnum.ABC)] 
    One, 
} 

Bây giờ chúng ta có thể sử dụng sự phản chiếu để trích xuất thông qua ServerEnum và nhận ánh xạ chuyển đổi từ chính khai báo enum.

Sự cố tôi gặp phải ở đây là trong khai báo thuộc tính Enum2Enum.

Điều này hoạt động nhưng thay thế đối tượng o bằng Enum e thì không. Tôi không muốn để có thể vượt qua trong các đối tượng để các nhà xây dựng, chỉ có enums khác.

public class EnumToEnumAttribute : Attribute 
{ 
    public EnumToEnumAttribute(object o){} 
} 

Điều này không biên dịch được.

public class EnumToEnumAttribute : Attribute 
{ 
    public EnumToEnumAttribute(Enum e){} 
} 

Có lý do gì cho lỗi biên dịch không? Làm cách nào khác tôi có thể chuyển thông tin cần thiết để lập bản đồ bên cạnh:

EnumtoEnumAttribute(Type dest, string enumString) 

Điều này có vẻ quá dài nhưng tôi đoán tôi sẽ sử dụng nó.

+0

Bạn đang gặp phải lỗi biên dịch nào? Ở đâu? –

Trả lời

0

Tôi có thể sử dụng cấu trúc làm loại và sau đó ném ngoại lệ nếu đó không phải là loại Enum. Tôi không thấy tùy chọn (Type, string) của bạn an toàn hơn là sử dụng đối tượng hoặc struct.

0

Here are the rules cho các loại có thể được bao gồm như là các thông số thuộc tính:

0

@Danial Jennings tôi đọc qua các quy tắc đó và tìm thấy: "Một kiểu enum, miễn là nó có khả năng tiếp cận công chúng và các loại, trong đó nó được lồng nhau (nếu có) cũng có khả năng truy cập công cộng (Phần 17.2). ".

Làm thế nào để thử Enum e trong hàm tạo không thành công dựa trên quy tắc được trích dẫn? Có phải vì việc loại enum không đảm bảo rằng các enums được thông qua được hiển thị công khai không? Điều này có vẻ đúng. Có cách nào để buộc quy tắc này ở thời gian biên dịch không?

@ bdukes Bạn chính xác là đúng. Tôi nên nghĩ về điều đó nhiều hơn.

Dường như kiểm tra loại thời gian chạy là lựa chọn duy nhất của tôi để đảm bảo rằng tôi chỉ lập bản đồ enums cho các enums khác.

0

Tại sao không sử dụng từ điển? Điều này có thể là một tài sản tĩnh của lớp học của bạn, khởi tạo với những khởi tạo đối tượng schmancy ưa thích, chúng tôi đã nhận được trong 3,0? Bạn sẽ không gõ nhiều mã hơn (ánh xạ phải được thực hiện ngay cả với thuộc tính sollution).

4

Sử dụng hầu hết các ví dụ tương tự, bạn có thể đạt được điều này trực tiếp trong enum:

public enum ServerEnum 
{ 
    One = ClientEnum.ABC, 
} 

này có lợi ích của việc không đòi hỏi phản xạ, dễ đọc (theo ý kiến ​​của tôi), và tổng thể đòi hỏi ít overhead .

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