C# 我可以将继承与扩展方法一起使用吗?

C# 我可以将继承与扩展方法一起使用吗?,c#,C#,我有以下资料: 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) { retur

我有以下资料:

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)是枚举

您可以使该方法通用。C#将推断类型:

public static class Extension 
{ 
    public static string D2<T> (this T key) 
    { 
        return ((int)(object) key).ToString("D2"); 
    } 
}
公共静态类扩展
{ 
公共静态字符串D2(此T键)
{ 
返回((int)(对象)键).ToString(“D2”);
} 
}

从下面的评论来看,
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"); 
    } 
}
公共静态类扩展
{ 
公共静态字符串D2(此T键),其中T:ID2Able
{ 
返回((int)键).ToString(“D2”);
} 
}
这样扩展方法就不会出现在所有类型中;它只对您从中继承的内容可用。

您的枚举已经全部从公共基类继承,即
System.Enum
。所以您可以这样做(枚举不接受“D2”作为格式字符串,但它们接受“D”,所以我添加了对PadLeft的调用):


是的,你可以。你唯一失去的是拥有自定义实现的能力,而这将无法按原样编译。你不能将
t
转换为
int
。我已经编辑过了。不过,如果您知道T是什么,where子句会更有意义。但是,这些类型是枚举类型,所以where子句没有帮助。此外,
(int)(object)键
强制转换仅在枚举具有默认基础类型
int
时才有效。如果枚举的基础类型为uint、long或ulong,则Convert.ToInt32可能会丢失信息。这很简单,但比
Convert.ToInt32(key).ToString(“D2”)慢,或者
ToInt64
关于这一点:)但这当然只有在速度真的很重要的情况下才有意思:)@flindeberg你分析过它吗?你怎么知道它慢了呢?我做了@phoog,
e.ToString(“D”)
Convert.ToInt64(e).ToString(“D2”)
的90%的时间里运行,但是添加了
PadLeft
后,它大约慢了50%,即
Convert.ToInt64(e).ToString(“D2”)
时间因子1,
e.ToString(“D”).PadLeft(2,'0'))
时间系数为1.33。除非速度真的很重要,否则这并不是什么大不了的事情,而且你正在做很多转换:)@flindeberg时间差取决于整数值是1个字符还是更多——如果pad的长度大于等于length参数,它将返回相同的字符串。但是,我还是对1000万次迭代进行了一些计时,发现对于较慢的代码,每次迭代大约需要0.41微秒,对于较快的代码,每次迭代大约需要0.36微秒。所以“很多”可能是一种轻描淡写的说法;-)@flindeberg试一下JohnB编辑的答案中建议的
(int)(object)键。它确实要快得多(但只有当您知道所有枚举的底层类型都是
int
时,它才起作用)。
public static class EnumExtensions
{
    public static string D2(this Enum e)
    {
        return e.ToString("D").PadLeft(2, '0');
    }
}