2010-12-14 43 views
10

Tôi biết tôi có thể đặt enum của mình tại khu vực Không gian tên của một lớp để mọi người có thể truy cập nó trong cùng một không gian tên.C#: Truy cập Enum từ một lớp khác

// defined in class2 
public enum Mode { Selected, New, } 

Những gì tôi muốn là để truy cập enum này từ

public class1 
{ 
    var class2 = new class2(); 
    // Set the Mode 
    class2.Mode = Model.Selected 
} 

Đây có phải là bằng cách nào đó có thể không sử dụng diện tích không gian tên?

+0

Thực sự không hiểu bạn ở đó ... bạn có thể truy cập các lớp được xác định bên trong các lớp học chỉ từ các đối tượng, giống như bạn đang làm, vậy vấn đề là gì? – Machinarius

+0

Tại sao bạn đang cố gắng tránh sử dụng vòng loại không gian tên? Ngoài ra, 'Vùng không gian tên của một lớp' không phải là rất rõ ràng. –

+1

Theo ý kiến ​​của tôi, bạn thực sự nên xác định một enum trong tập tin riêng của mình. Bằng cách đó bạn sẽ không có các lớp lồng nhau để tham chiếu. – froeschli

Trả lời

7

Nếu bạn đang cố gắng làm những gì được mô tả bên dưới, nó sẽ không hoạt động ...

public class MyClass1 
    { 
     private enum Mode { New, Selected }; 
     public Mode ModeProperty { get; set; } 
    } 

    public class MyClass2 
    { 
     public MyClass2() 
     { 
      var myClass1 = new MyClass1(); 

      //this will not work due to protection level 
      myClass1.ModeProperty = MyClass1.Mode. 
     } 
    } 

Tuy nhiên, bạn có thể làm gì dưới đây, sẽ hoạt động ...

public interface IEnums 
    { 
     public enum Mode { New, Selected }; 
    } 

    public class MyClass1 
    { 
     public IEnums.Mode ModeProperty { get; set; } 
    } 

    public class MyClass2 
    { 
     public MyClass2() 
     { 
      var myClass1 = new MyClass1(); 

      //this will work 
      myClass1.ModeProperty = IEnums.Mode.New; 
     } 
    } 
+0

@Lisa Tôi đã chỉnh sửa câu trả lời thành nội tuyến hơn với tôi nghĩ bạn đang cố gắng làm gì ... nếu không ... thì câu trả lời khác nằm trong lịch sử ... :) –

+6

Tôi nhận được giao diện không thể khai báo loại khi sử dụng mã này –

+0

Vì vậy, tôi, ngoài nhận xét của Idan Shechter "Tôi nhận được giao diện không thể khai báo các loại khi sử dụng mã này". – fletchsod

4

Có:

class2.Mode = class2.Mode.Selected 

Nhưng lưu ý rằng bạn không thể có một loại lồng nhau được xác định có tên giống như một trong những thành viên lớp bên ngoài, do đó, mã này sẽ không biên dịch. Hoặc enum hoặc tài sản sẽ cần phải được đặt tên một cái gì đó khác. Tên lớp và tên biến của bạn xung đột quá, làm cho nó phức tạp hơn một chút.

Để làm điều này một câu trả lời chung chung hơn, nếu bạn có điều này:

public class Foo 
{ 
    public SomeEnum SomeProperty { get; set; } 

    public enum SomeEnum { 
     Hello, World 
    } 
} 

Sau đó, mã này sẽ chỉ định một giá trị enum để tài sản:

Foo foo = new Foo(); 
foo.SomeProperty = Foo.SomeEnum.Hello; 
+1

Khi tôi nhập class2. Chế độ enum không xuất hiện trong Intellisense nên có vẻ như KHÔNG làm việc. Như tôi đã mô tả, tôi muốn thiết lập Mode trên một INSTANCE không thông qua classname.Mode. – Elisabeth

+0

@Lisa: Đó là vì bạn đã đặt tên biến của bạn cùng tên với lớp. Các biểu tượng chồng lên nhau, do đó trình biên dịch giả sử bạn đang đề cập đến biến. Thay đổi tên biến của bạn hoặc tên của lớp. Xem mã ví dụ bổ sung của tôi cho cú pháp thích hợp bạn sẽ phải sử dụng sau khi đổi tên một trong số chúng. – cdhowie

+0

@Elisabeth Tôi có cùng một vấn đề. Lời giải thích cuối cùng tôi tìm thấy thực sự là đơn giản: enum là một phần của lớp, không phải là một phần của một cá thể lớp. Như bạn đã nhận xét ở trên, việc sử dụng thuộc tính là giải pháp tốt nhất. – jibbs

16

Bạn có thể khai báo một enum bên ngoài của một lớp:

namespace MyNamespace 
{ 
    public enum MyEnum 
    { 
     Entry1, 
     Entry2, 
    } 
} 

Và sau đó bạn có thể thêm using MyNamespace; nơi nó cần phải được sử dụng.

+0

OP nói * "Có phải bằng cách nào đó có thể không sử dụng vùng không gian tên không?" * – cdhowie

+0

@cdhowie: Tôi đã nhầm lẫn với một số từ ngữ trong câu hỏi, vì vậy tôi nghĩ cô ấy đang cố gắng tránh sự cần thiết phải đủ điều kiện cho tên lớp . Câu trả lời của bạn và về cơ bản tôi cho thấy đầy đủ cách thức các enums có thể được khai báo, do đó, cách này hay cách khác câu hỏi sẽ được trả lời :-) –

+0

Tôi hiểu, đó là một cách giải thích có thể. Từ ngữ chắc chắn không rõ ràng. :) – cdhowie

5

câu trả lời của Aaron là rất đẹp, nhưng tôi tin rằng có một cách tốt hơn để làm điều này:

public static class class1 
{ 
    public void Run() 
    { 
     class2.Mode mode = class2.Mode.Selected; 

     if (mode == class2.Mode.Selected) 
     { 
      // Do something crazy here... 
     } 
    } 
} 

public static class class2 
{ 
    public enum Mode 
    { 
     Selected, 
     New 
    } 
} 

Không có điểm phức tạp hơn này. Đó là một nhiệm vụ đơn giản.

Tất cả tốt nhất

Chris.

+2

Tôi nhận được lỗi "giao diện không thể khai báo các loại" khi tôi sử dụng giải pháp được chấp nhận, tuy nhiên điều này làm việc khá tốt! –

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