2012-01-17 46 views
17

thể trùng lặp:
Cast int to Enum in C#Có thể truyền số nguyên thành enum không?

tôi đã enum sau:

public enum detallistaDocumentStatus { 

    /// <remarks/> 
    ORIGINAL, 

    /// <remarks/> 
    COPY, 

    /// <remarks/> 
    REEMPLAZA, 

    /// <remarks/> 
    DELETE, 
} 

sau đó tôi nhận được một tài sản lớp kiểu detallistaDocumentStatus:

public detallistaDocumentStatus documentStatus { 
     get { 
      return this.documentStatusField; 
     } 
     set { 
      this.documentStatusField = value; 
     } 
    } 

Trong cuộc sống thực, người dùng sẽ gửi cho chúng tôi một số (1, 2, 3 hoặc 4) đại diện cho mỗi giá trị enum theo thứ tự chúng được khai báo.

vì vậy, có thể truyền như thế này không?

det.documentStatus = (detallistaDocumentStatus)3; 

nếu không, làm thế nào tôi có thể nhận được giá trị enum sử dụng một số nguyên như một chỉ số, chúng tôi đang sử dụng rất nhiều enums, vì vậy chúng tôi muốn làm một cái gì đó chung chung và tái sử dụng

+4

Tôi chỉ định rõ giá trị cho giá trị enum của bạn nếu bạn dự định sử dụng giá trị này như thế này. – Yuck

+20

Tôi sẽ bắt đầu thực hiện nhận xét mặc định này: Bạn đã thử chưa? Nếu vậy, chuyện gì đã xảy ra? –

+2

Lên các câu hỏi bỏ phiếu như thế này ngăn cản tôi. –

Trả lời

41

Có, bạn có thể truyền Enum đến int và ngược lại, bởi vì mỗi Enum thực sự được đại diện bởi một int theo mặc định. Bạn nên chỉ định thủ công các giá trị thành viên. Theo mặc định, giá trị này bắt đầu từ 0 đến N.

Cũng có thể truyền Enum đến string và ngược lại.

public enum MyEnum 
{ 
    Value1 = 1, 
    Value2 = 2, 
    Value3 = 3 
} 

private static void Main(string[] args) 
{ 
    int enumAsInt = (int)MyEnum.Value2; //enumAsInt == 2 

    int myValueToCast = 3; 
    string myValueAsString = "Value1"; 
    MyEnum myValueAsEnum = (MyEnum)myValueToCast; // Will be Value3 

    MyEnum myValueAsEnumFromString; 
    if (Enum.TryParse<MyEnum>(myValueAsString, out myValueAsEnumFromString)) 
    { 
     // Put logic here 
     // myValueAsEnumFromString will be Value1 
    } 

    Console.ReadLine(); 
} 
+0

Giả sử bạn chưa xác định enum của bạn là 'public enum MyEnum: long', trong trường hợp đúc thành int có thể dẫn đến cắt ngắn. –

+0

Đúng. Tương tự cho uint/ulong. – ken2k

+0

Vì tiêu đề của câu hỏi là về việc đúc enum thành int và câu trả lời được đánh dấu không thực sự bao gồm điều đó như một phần của ví dụ mã, tôi đã thêm vào đó. – AaronLS

13

Có nó là có thể. Tôi sử dụng sau ENUM

public enum AccountTypes 
{ 
    Proposed = 1, 
    Open = 2 
} 

sau đó khi tôi gọi nó là tôi sử dụng này để có được giá trị:

(int)AccountTypes.Open 

Và nó sẽ trả về giá trị int mà tôi cần mà cho ở trên sẽ là 2.

+2

OP đang cố gắng thực hiện theo cách khác. Anh ta có giá trị số nguyên và cần tìm giá trị enum tương ứng. – Yuck

+0

ah, tôi thấy rằng bây giờ, cảm ơn vì đã chỉ ra. Điều này vẫn có thể được sử dụng để xem nếu giá trị được gửi bằng với giá trị của enum – Taryn

-1

ENUM chỉ là cách thuận tiện để đặt tên số nguyên. Giá trị của ENUM có thể được cộng, trừ và so sánh giống như cách mà int có thể.

1
det.documentStatus = (detallistaDocumentStatus)3; 

Điều trên sẽ hoạt động tốt. Chỉ có điều cần nhớ ở đây là nếu bạn đang gán số cụ thể cho các thành viên enum thì một cái gì đó như thế này có thể không hoạt động như mong đợi. Ngoài ra nếu bạn không đánh số rõ ràng các giá trị enum của bạn thì các thành viên enum bắt đầu từ chỉ số dựa trên 0.

Vì vậy, mã ở trên sẽ chỉ định thành viên thứ tư của enum theo thứ tự khai báo.

Để kiểm tra xem một số nguyên nhất định là một giá trị enum giá trị enum sử dụng Enum.IsDefined

1

Nếu bạn đưa ra một giá trị số nguyên rõ ràng cho các thành viên enum của bạn, như vậy:

public enum Foo 
{ 
    Five=5 
    , Six 
    , Seven 
    , Eight 
} 

Bạn chỉ có thể cast chúng đến một số int để nhận giá trị ngầm định.

var bar = (int)Foo.Six: /// bar == 6 

Nếu bạn không xác định rõ ràng giá trị cho ít nhất giá trị đầu tiên, hãy đưa giá trị đó vào int sẽ cho bạn thứ tự xuất hiện trong khai báo.

10

Từ Đặc điểm kỹ thuật C# 4.0:

1,10 Enums

giá trị Enum có thể được chuyển đổi sang giá trị không thể thiếu và ngược lại sử dụng loại phôi. Ví dụ

int i = (int)Color.Blue;  // int i = 2; 
Color c = (Color)2;    // Color c = Color.Blue; 

Một điều bổ sung để được nhận thức được rằng bạn được phép bỏ bất kỳ giá trị không thể thiếu trong phạm vi của loại hình cơ bản của enum (theo mặc định đó là int), ngay cả khi giá trị mà không ánh xạ tới một trong các tên trong khai báo enum. Từ 1,10 Enums:

Tập hợp các giá trị mà loại enum có thể tiếp tục không bị giới hạn bởi thành viên enum . Cụ thể, bất kỳ giá trị nào của kiểu cơ bản của một enenum có thể được truyền đến loại enum và là một giá trị hợp lệ riêng biệt của loại enum đó.

Vì vậy, sau đây cũng được chấp nhận với enum trong ví dụ của bạn:

det.documentStatus = (detallistaDocumentStatus) 42; 

mặc dù không có tên enum có giá trị 42.

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