在泛型方法中将值转换为T.

Ben*_*jol 15 c# generics

我有一个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)

但就性能而言,这并不理想.

不幸的是,我认为这只是泛型的限制.


Ant*_*lev 5

我想这只是一个错字,但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)