문제

VS2008에서, 열거에 적용되는 확장 방법을 작성할 수 있습니다.

나는 당신이 특정 열거에 대해 확장 방법을 작성할 수 있다는 것을 알고 있지만 단일 확장 방법을 사용하여 모든 열거를 할 수 있기를 원합니다. 이게 가능해?

도움이 되었습니까?

해결책

예, 기본에 대한 코드 만 코드하십시오 Enum 유형, 예를 들어

public static void Something(this Enum e)
{
    // code here
}

다운 측은 아마도 당신은 아마도 당신이 아마 Enum.GetUnderlyingType, 열거의 기본 유형이 무엇인지에 따라 주조하고 다른 가지를 내려 가면서, 당신은 그것에 대한 좋은 용도를 찾을 수 있습니다 (예 : 우리는 가지고 있습니다. IsOneOf 그리고 IsCombinationOf 모든 열거에 적용되는 방법).

추신 : 조언을받을 수는 있지만 사용할 수있는 방법을 작성할 때 기억하십시오. float 그리고 double 열거의 기본 유형이므로 서명되지 않은 값뿐만 아니라 특수 사례가 필요합니다.

다른 팁

그래 넌 할수있어. 대상 확장 유형은 유형입니다 Enum. C#에서는 다음과 같이 수행됩니다.

public static void EnumExtension(this Enum e)
{
}

또는 VB에서 이와 같이 :

<Extension()> _
Public Sub EnumExtension(ByVal s As Enum)
End Sub

참고로 여기에 내가 사용할 수있는 열거 확장 방법의 훌륭한 예가 있습니다. 열거에 대한 insensitive tryparse () 함수를 구현합니다.

public static class ExtensionMethods
{
    public static bool TryParse<T>(this Enum theEnum, string strType, 
        out T result)
    {
        string strTypeFixed = strType.Replace(' ', '_');
        if (Enum.IsDefined(typeof(T), strTypeFixed))
        {
            result = (T)Enum.Parse(typeof(T), strTypeFixed, true);
            return true;
        }
        else
        {
            foreach (string value in Enum.GetNames(typeof(T)))
            {
                if (value.Equals(strTypeFixed, 
                    StringComparison.OrdinalIgnoreCase))
                {
                    result = (T)Enum.Parse(typeof(T), value);
                    return true;
                }
            }
            result = default(T);
            return false;
        }
    }
}

다음과 같은 방식으로 사용합니다.

public enum TestEnum
{
    A,
    B,
    C
}

public void TestMethod(string StringOfEnum)
{
    TestEnum myEnum;
    myEnum.TryParse(StringOfEnum, out myEnum);
}

다음은이 코드를 제시하기 위해 방문한 두 사이트입니다.

열거에 대한 케이스 둔감 한 tryparse

열거를위한 확장 방법

또 다른 예는 다음과 같습니다. 또한 임시 변수를 작성하고 초기화하는 것보다 더 좋은 IMHO.

public static class ExtensionMethods 
{
    public static void ForEach(this Enum enumType, Action<Enum> action)
    {
        foreach (var type in Enum.GetValues(enumType.GetType()))
        {
            action((Enum)type);
        }
    }
}

public enum TestEnum { A,B,C } 
public void TestMethod() 
{
    default(TestEnum).ForEach(Console.WriteLine); 
} 

다음과 같이 변환 방법을 구현할 수도 있습니다.

public static class Extensions
{
    public static ConvertType Convert<ConvertType>(this Enum e)
    {
        object o = null;
        Type type = typeof(ConvertType);

        if (type == typeof(int))
        {
            o = Convert.ToInt32(e);
        }
        else if (type == typeof(long))
        {
            o = Convert.ToInt64(e);
        }
        else if (type == typeof(short))
        {
            o = Convert.ToInt16(e);
        }
        else
        {
            o = Convert.ToString(e);
        }

        return (ConvertType)o;
    }
}

예제 사용법은 다음과 같습니다.

int a = MyEnum.A.Convert<int>();

때로는 열거의 이름이나 값에 따라 한 열거에서 다른 열거로 변환해야 할 필요가 있습니다. 확장 방법으로 잘 수행 할 수있는 방법은 다음과 같습니다.

enum Enum1 { One = 1, Two = 2, Three = 3 };
enum Enum2 { Due = 2, Uno = 1 };
enum Enum3 { Two, One };

Enum2 e2 = Enum1.One.ConvertByValue<Enum2>();
Enum3 e3 = Enum1.One.ConvertByName<Enum3>();
Enum3 x2 = Enum1.Three.ConvertByValue<Enum3>();

public static class EnumConversionExtensions
{
    public static T ConvertByName<T>(this Enum value)
    {
        return (T)Enum.Parse(typeof(T), Enum.GetName(value.GetType(), value));
    }

    public static T ConvertByValue<T>(this Enum value)
    {
        return (T)((dynamic)((int)((object)value)));
    }
}

열거 확장의 또 다른 예 - 이번에는 입력 열거 유형을 반환합니다.

public static IEnumerable<T> toElementsCollection<T>(this T value) where T : struct, IConvertible
    {
        if (typeof(T).IsEnum == false) throw new Exception("typeof(T).IsEnum == false");

        return Enum.GetValues(typeof(T)).Cast<T>();
    }

사용의 예 :

public enum TestEnum { A,B,C };

TestEnum.A.toElementsCollection();
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top