Могу ли я использовать наследование с помощью метода расширения?

У меня есть следующее:

public static class CityStatusExt
{
    public static string D2(this CityStatus key)
    {
        return ((int) key).ToString("D2");
    }


public static class CityTypeExt
{
    public static string D2(this CityType key)
    {
        return ((int) key).ToString("D2");
    }

Плюс другие классы с похожими расширениями, которые возвращают ключ, отформатированный как "D2"

Есть ли способ, который я мог бы наследовать от базового класса и предоставить базовый класс для обеспечения такой функциональности не нужно ли мне повторять один и тот же код метода расширения?

Обновление. Мне жаль, что я не упоминал об этом, но мои классы, такие как CityType, являются Enums.

Ответ 1

Из комментария ниже, CityType и CityStatus перечислены. Поэтому вы можете сделать это:

public static class Extensions
{
    public static string D2(this Enum key)
    {
        return Convert.ToInt32(key).ToString("D2");
    }
}

Оригинальный ответ:

Вы можете использовать общий метод и интерфейс ID2Able:

public static class Extensions
{ 
    public static string D2<T>(this T key) where T : ID2Able
    { 
        return ((int) key).ToString("D2"); 
    } 
}

Таким образом, метод расширения не будет отображаться абсолютно для каждого типа; он будет доступен только для вещей, наследуемых ID2Able.

Ответ 2

Вы можете сделать метод общим. С# выберет тип:

public static class Extension 
{ 
    public static string D2<T> (this T key) 
    { 
        return ((int)(object) key).ToString("D2"); 
    } 
}

Ответ 3

Ваши перечисления уже все наследуются от общего базового класса, а именно System.Enum. Таким образом, вы можете сделать это (Enums не принимают "D2" в качестве строки формата, но они принимают "D", поэтому я добавил вызов PadLeft):

public static class EnumExtensions
{
    public static string D2(this Enum e)
    {
        return e.ToString("D").PadLeft(2, '0');
    }
}