2012-01-13 23 views
15

Tôi đang tạo đối tượng kinh doanh từ this schema bằng Kiến trúc sư doanh nghiệp.Làm thế nào tôi có thể nhận được enum để chứa một dấu gạch ngang (-)?

Giản đồ có đặc điểm kỹ thuật liệt kê sau đây:

<xs:simpleType name="PackageMedium"> 
    <xs:restriction base="xs:string"> 
     <xs:enumeration value="NTP"/> 
     <xs:enumeration value="DAT"/> 
     <xs:enumeration value="Exabyte"/> 
     <xs:enumeration value="CD-ROM"/> 
     <xs:enumeration value="DLT"/> 
     <xs:enumeration value="D1"/> 
     <xs:enumeration value="DVD"/> 
     <xs:enumeration value="BD"/> 
     <xs:enumeration value="LTO"/> 
     <xs:enumeration value="LTO2"/> 
     <xs:enumeration value="LTO4"/> 
    </xs:restriction> 
</xs:simpleType> 

Doanh nghiệp kiến ​​trúc sư tạo ra đoạn mã sau nhưng Visual Studio không thích các dấu gạch ngang (-) trong CD-ROM và sẽ không biên dịch.

public enum PackageMedium : int { 
    NTP, 
    DAT, 
    Exabyte, 
    CD-ROM, 
    DLT, 
    D1, 
    DVD, 
    BD, 
    LTO, 
    LTO2, 
    LTO4 
} 

Tôi có thể làm gì để thực hiện công việc này?


dựa trên @Craig Stuntz câu trả lời tôi đã có thể tìm this article đó đã giúp tôi lấy lại những ký tự đặc biệt từ Enum.

+0

Bạn có thể thay đổi thành dấu gạch dưới không? – Marnix

+0

@Marnix: Tôi nghĩ là không. Đó là một tiêu chuẩn OGC, tôi nghĩ rằng tôi cần phải có nó như lược đồ nói. – capdragon

Trả lời

13

Bạn không thể. Ngừng hẳn. Tuy nhiên, có cách giải quyết. Bạn có thể, ví dụ: sử dụng DescriptionAttribute:

public enum PackageMedium : int { 
    NTP, 
    DAT, 
    Exabyte, 
    [Description("CD-ROM")] 
    CDROM, 
    DLT, 
    D1, 
    DVD, 
    BD, 
    LTO, 
    LTO2, 
    LTO4 
} 

Điều này có nghĩa là bạn có nhiều việc phải làm khi ánh xạ giá trị. Mặt khác, nó ở biên dịch vì sợ.

Nếu bạn không thích điều đó, chọn cách giải quyết khác, ví dụ, một cuốn từ điển:

var dict = Enum.GetValues(typeof(PackageMedium)) 
       .Cast<PackageMedium>() 
       .Select(v => Tuple.Create(v == PackageMedium.CDROM ? "CD-ROM" : v.ToString(), v)) 
       .ToDictionary(t => t.Item1, t => t.Item2); 

var myEnumVal = dict["CD-ROM"]; 
+0

Nếu tôi đi với một từ điển hoặc danh sách, điều đó vẫn "đúng" với giản đồ như nó? – capdragon

+0

Và bạn có thể vui lòng đăng mã ví dụ của phiên bản Từ điển hoặc Danh sách không? – capdragon

+0

Thực ra, tôi sẽ chỉ mô tả. – capdragon

6

Câu trả lời ngắn: Số

Lý do là rằng nhân vật - được sử dụng như một thẻ bởi lexer cho các mục đích khác như đại diện cho nhị phân và toán tử trừ đơn nhất.

Đặt cược tốt nhất của bạn là xóa - hoặc thay thế bằng một số ký tự khác là ký tự hợp lệ trong tên nhận dạng. Ký tự không phải chữ cái duy nhất bạn thường có thể sử dụng là _.

Bạn có thể tìm thêm thông tin trong số C# Specification.

1

Mã định danh C# phải bắt đầu bằng dấu gạch dưới, một ký tự trong lớp Unicode Lu, Ll, Lt, Lm, Lo hoặc Nl hoặc thoát cho một trong số đó. Tất cả các ký tự khác phải là từ lớp Unicode Lu, Ll, Lt, Lm, Lo, Nl, Mn, Mc, Nd, Pc hoặc Cf hoặc một lối thoát cho một trong số đó.

Dấu gạch ngang trừ là loại Pd.

Nếu C# đã cho phép, bạn vẫn không thể sử dụng nó trên số nhận dạng công khai nếu bạn cần tuân thủ CLS, vì nó cũng không phù hợp với quy tắc của nó.

Đây chỉ là tốt, như thế nào thì bạn có nghĩa là để phân biệt CD-ROM nghĩa là một mặt hàng cụ thể trong enum từ CD-ROM nghĩa để áp dụng các nhà điều hành - với CD như các toán hạng tay trái và ROM là toán hạng bên phải?

Nếu danh sách các khả năng đó được mã hóa cứng, tôi chỉ cần xóa dấu trừ gạch nối và có CDROM làm nhãn. Nếu nó không được mã hóa cứng, tôi sẽ sử dụng một từ điển, vì nó có khả năng phục hồi khi đối mặt với nhiều trường hợp hơn, nơi một thứ không thể là một định danh.

+0

Tôi sẽ sử dụng từ điển như thế nào? Nếu một từ điển sẽ đáp ứng tất cả các lược đồ, bạn có thể vui lòng chỉnh sửa bình luận của bạn để bao gồm mã của một phiên bản từ điển không? – capdragon

+0

Craig là con đường phía trước của tôi về điều đó :) –

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