Могу ли я использовать наследование с помощью метода расширения?
У меня есть следующее:
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');
}
}