Frage

In VS2008 ist es möglich, eine Erweiterung Methoden zu schreiben, die auf jede Aufzählung gelten würden.

Ich weiß, dass Sie Erweiterungsmethoden gegen eine bestimmte Aufzählung schreiben können, aber ich mag jede Aufzählung der Lage sein, ein einzelnen Verlängerungsverfahren. Ist das möglich?

War es hilfreich?

Lösung

Ja, nur Code gegen die Basis Enum Typen, z.

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

Die Kehrseite ist, dass Sie werden wahrscheinlich einige ziemlich üble Sachen am Ende tun wie der realen Basistyp zu finden, mit

Andere Tipps

Ja, Sie können. Das Ziel extenstion Typ ist vom Typ Enum. In C #, würde dies getan, wie:

public static void EnumExtension(this Enum e)
{
}

oder wie dies in VB:

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

Hier ist ein weiteres Beispiel -. Auch schöner IMHO, als wenn zu erstellen und eine temporäre Variable initialisieren

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); 
} 

Sie können auch Konvertierungsmethode implementieren wie folgt:

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;
    }
}

Hier ist ein Beispiel für die Verwendung:

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

Manchmal ist es notwendig, von einer Enum in einem anderes zu konvertieren, basierend auf dem Namen oder den Wert der Enumeration. Hier ist, wie kann es gut mit Erweiterungsmethoden erfolgen:

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)));
    }
}

Ein weiteres Beispiel zur Herstellung von Enum-Erweiterung -. Aber diesmal ist es die Eingabe Aufzählungstyp gibt

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>();
    }

Beispiel für die Verwendung:

public enum TestEnum { A,B,C };

TestEnum.A.toElementsCollection();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top