我有一个creaky属性映射的接口:
interface IPropertyMap
{
bool Exists(string key);
int GetInt(string key);
string GetString(string key);
//etc..
}
Run Code Online (Sandbox Code Playgroud)
我想创建一个像这样的扩展方法:
public static T GetOrDefault<T>(this IPropertyMap map, string key, T defaultValue)
{
if (!map.Exists(key))
return defaultValue;
else
{
if (typeof(T) == typeof(int)) return (T)map.GetInt(key);
//etc..
}
}
Run Code Online (Sandbox Code Playgroud)
但编译器不会让我转向T.我尝试添加,where T : struct但似乎没有帮助.
我错过了什么?
Jon*_*eet 29
我相信这是因为编译器不知道它需要执行什么类型的操作.IIRC,如果你介绍拳击,你可以让它工作:
if (typeof(T) == typeof(int)) return (T)(object)map.GetInt(key);
Run Code Online (Sandbox Code Playgroud)
但就性能而言,这并不理想.
不幸的是,我认为这只是泛型的限制.
我想这只是一个错字,但bool GetInt(string key)看起来很奇怪。应该是这样int GetInt(string key),或者更好int GetInt32(string key)。
接下来,乔恩已经指出,您的代码需要装箱才能工作,所以这就是您要做的。
最后,在您的界面中添加一个“包罗万象”的方法IPropertyMap- 说object GetValue(string key)然后重写GetOrDefault<T>以利用此方法,而不是无休止且容易出错的Type比较:
else
return (T)(object)map.GetValue(key);
Run Code Online (Sandbox Code Playgroud)