سؤال

في vs2008, هل من الممكن كتابة امتداد الطرق التي من شأنها أن تنطبق على أي التعداد.

وأنا أعلم أنك يمكن أن يكتب امتداد طرق معينة التعداد ، ولكن أريد أن تكون قادرة على كل التعداد باستخدام ملحق واحد الأسلوب.هل هذا ممكن ؟

هل كانت مفيدة؟

المحلول

نعم، رمز فقط ضد نوع قاعدة Enum، منها مثلا.

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

ووالجانب السلبي هو عليك ربما ينتهي به بعض الاشياء السيئة تماما مثل العثور على نوع قاعدة حقيقية باستخدام <لأ href = "http://msdn.microsoft.com/en-us/library/system.enum .getunderlyingtype.aspx "يختلط =" noreferrer "> Enum.GetUnderlyingType ، والصب، والذهاب الفروع المختلفة أسفل اعتمادا على ما نوع قاعدة التعداد هو، ولكن يمكنك أن تجد بعض الاستخدامات الجيدة لذلك (على سبيل المثال لدينا IsOneOf و طرق IsCombinationOf التي تنطبق على كل تتضمن التعدادات).

وPS: تذكر عند كتابة الأسلوب الذي، على الرغم من نصح سوء، يمكنك استخدام float وdouble وأنواع قاعدة لتتضمن التعدادات لذلك ستحتاج بعض الحالات الخاصة لهؤلاء وكذلك القيم غير الموقعة

نصائح أخرى

نعم، يمكنك. نوع extenstion الهدف من نوع Enum. في C #، أن يتم ذلك على النحو التالي:

public static void EnumExtension(this Enum e)
{
}

وأو ما شابه ذلك في VB:

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

ومعلوماتك هنا هو مثال عظيم على طريقة التعداد تمديد بأنني تمكنت من استخدامها. وتنفذ وظيفة قضية حساسة 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