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');
}
}