C #의 열거 형 내부 메서드


165

Java에서는 열거 형 안에 메소드를 가질 수 있습니다.

C #에 그러한 가능성이 있습니까? 아니면 문자열 모음입니까?

재정의를 시도했지만 ToString()컴파일되지 않습니다. 누군가 간단한 코드 샘플을 가지고 있습니까?


C #의 Enum 안에 메서드를 사용할 수 있다고 생각하지 않습니다. 무엇을하려고합니까?
Duncan Howe

Java 동작을 얻고 Enum에 가까운 논리를 캡슐화하려고합니다. 어쨌든 나는 대답에서 볼 수 없다-나는 확장을 구현할 것이다.
Eya

답변:


272

열거 형 유형에 대한 확장 메소드 를 작성할 수 있습니다 .

enum Stuff
{
    Thing1,
    Thing2
}

static class StuffMethods
{

    public static String GetString(this Stuff s1)
    {
        switch (s1)
        {
            case Stuff.Thing1:
                return "Yeah!";
            case Stuff.Thing2:
                return "Okay!";
            default:
                return "What?!";
        }
    }
}

class Program
{


    static void Main(string[] args)
    {
        Stuff thing = Stuff.Thing1;
        String str = thing.GetString();
    }
}


11

또 다른 옵션은 Jimmy Bogard가 만든 Enumeration Class 를 사용하는 것 입니다.

기본적으로로부터 상속되는 클래스를 만들어야합니다 Enumeration. 예:

public class EmployeeType : Enumeration
{
    public static readonly EmployeeType Manager 
        = new EmployeeType(0, "Manager");
    public static readonly EmployeeType Servant 
        = new EmployeeType(1, "Servant");
    public static readonly EmployeeType Assistant
        = new EmployeeType(2, "Assistant to the Regional Manager");

    private EmployeeType() { }
    private EmployeeType(int value, string displayName) : base(value, displayName) { }

    // Your method...
    public override string ToString()
    {
        return $"{value} - {displayName}!";
    }
}

그런 다음 열거 형처럼 사용할 수 있으며 메소드를 다른 방법으로 넣을 수 있습니다.

EmployeeType.Manager.ToString();
//0 - Manager
EmployeeType.Servant.ToString();
//1 - Servant
EmployeeType.Assistant.ToString();
//2 - Assistant to the Regional Manager

NuGet으로 다운로드 할 수 있습니다 .

이 구현은 언어에 고유하지 않지만 구문 (구성 및 사용법)은 C # ( 예 : Kotlin) 보다 기본적으로 enum을 더 잘 구현하는 언어와 매우 유사합니다 .


3

아니. 그런 다음에 클래스에 속성의 무리를 추가하는 클래스를 만들 수 있습니다 다소 열거을 모방하지만, 그게 정말 같은 일 .

class MyClass
{
    public string MyString1 { get{ return "one";} }
    public string MyString2 { get{ return "two";} }
    public string MyString3 { get{ return "three";} }

    public void MyMethod()
    {
        // do something.
    }
}

더 나은 패턴은 메소드를 에뮬과 별도로 클래스에 배치하는 것입니다.


0

내가 와서 열거 형과 문자열의 정반대가 필요했기 때문에 일반적인 해결책은 다음과 같습니다.

static class EnumExtensions {
    public static T GetEnum<T>(this string itemName) {
        return (T) Enum.Parse(typeof(T), itemName, true);
    }
}

이것은 대소 문자를 무시하고 더 많은 유형 안전을 얻기 위해 열거 형으로 REST- 응답을 구문 분석하는 데 매우 편리합니다. 잘만되면 그것은 누군가를 돕는다


-15

C # 클래스 기반 원칙이 아니라 문자열과 값이있는 2 차원 배열이므로 열거 자에서 메서드를 사용할 수 없습니다.

이 경우 클래스 사용은 Microsoft에서 권장하지 않습니다. 대신 (data) struct (ures)를 사용하십시오. STRUCT는 데이터 및 처리기의 경량 클래스로 설계되었으며 함수를 잘 처리 할 수 ​​있습니다. C #과 컴파일러에는 JAVA에서 알 수 있듯이 추적 및 효율성 기능이 없습니다. 여기서 특정 클래스 / 메소드를 더 많이 사용하면 실행 속도가 빨라지고 사용이 '예상됩니다'. C #에는 단순히 그 기능이 없으므로 구분하기 위해 CLASS 대신 STRUCT를 사용하십시오.


7
이 답변에 무엇이 잘못되었는지 설명하기 위해 단일 의견없이 7 번의 투표를 했습니까? C'mon guys ...
Good Night Nerd Pride

이 게시물에 제공된 모든 정보가 잘못 되었습니까?
VK

5
이 부분은 사실입니다. C # 열거 자에서 메서드를 사용할 수 없습니다. 그래도 추론이 올바른지 확신 할 수 없으며 두 번째 단락은 질문과 완전히 관련이없는 것 같습니다. 구조체를 사용하여 행동으로 열거 형을 시뮬레이션하는 방법이 있다면 예제를 제공하는 것이 가장 좋습니다.
Mishelle

3
나는 그 의미가 상당히 분명하다고 생각합니다. 구조체에는 메서드가 있고 값 형식이기 때문에 메서드를 추가하기 위해 열거 형 (값 형식)을 클래스 (참조 형식)로 바꾸지 마십시오.
제련
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.