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

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

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.

 nawfal24 окт. 2012 г., 08:15
Да, ты можешь. Единственное, что вы теряете, это возможность иметь пользовательскую реализацию.

Ответы на вопрос(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');
    }
}
 flindeberg24 окт. 2012 г., 09:27
Я сделал @phoog,e.ToString("D") работает в 90% времениConvert.ToInt64(e).ToString("D2") но с добавлениемPadLeft это будет медленнее примерно на 50%, т.е.Convert.ToInt64(e).ToString("D2") фактор времени 1,e.ToString("D").PadLeft(2,'0') с временным фактором 1,33. Это действительно неэто большая часть сделки, если скоростьдействительно имеет важное значение, и вы делаете это преобразование много :)
 phoog24 окт. 2012 г., 09:15
@flindeberg ты профилировал это? Откуда ты знаешь'медленнее?
 phoog24 окт. 2012 г., 09:43
@flindeberg попробуй(int)(object)key В ролях предлагается в JohnB 'Отредактированный ответ. Это'действительно намного быстрее (но работает, только если вы знаете, что все ваши перечисления имеютint как их основной тип).
 phoog24 окт. 2012 г., 09:36
@flindeberg Разница во времени зависит от того, является ли целочисленное значение 1 символом или более - pad будет возвращать ту же строку, если ее длина>= длина аргумента. Но все же, я выполнил некоторые измерения с 10 миллионами итераций и обнаружил, что каждая итерация занимает около 0,41 микросекунды с моим более медленным кодом и 0,36 микросекунды с более быстрым кодом. Так "много" возможно преуменьшение ;-)
 flindeberg24 окт. 2012 г., 09:03
Это красиво и легко, но медленнее, чемConvert.ToInt32(key).ToString("D2"), или жеToInt64 в этом отношении :) Но это, конечно, только интересно, если скоростьдействительно это суть :)
 flindeberg24 окт. 2012 г., 11:01
Действительно, это было быстро :) 5 с против 3 с за 10 000 000 итераций :) И, как вы сказали, планшет получился намного быстрее, когда этого не произошло.надо набивать :)

public static class Extension 
{ 
    public static string D2<t> (this T key) 
    { 
        return ((int)(object) key).ToString("D2"); 
    } 
}
</t>
 phoog24 окт. 2012 г., 09:40
Однако типы являются перечисляемыми типами, поэтому предложение where победилоТ помочь. Так же(int)(object)key приведение будет работать, только если перечисление имеет базовый тип по умолчанию.int
 phoog24 окт. 2012 г., 08:23
Это победилокомпилировать как есть. Вы можете'т бросокT к .I 'int
 JohnB24 окт. 2012 г., 09:29
Я редактировал это. Тем не менее, если вы знаете, что будет T, предложение where будет иметь больше смысла.
Решение Вопроса

Из комментария ниже,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"); 
    } 
}
</t>

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

 phoog24 окт. 2012 г., 08:35
Convert.ToInt32 рискует потерять информацию, если enum 'Основной тип Uint, длинный или удлиненный.

Ваш ответ на вопрос