如果已知为Int64,如何将Int64类型的值提供给Generic类型?

时间:2014-10-22 08:09:29

标签: c# generics

我使用以下方法。

public static Generic Get<Generic>(this object self)
{
  try { return (Generic)self; }
  catch (Exception) { return default(Generic); }
}

新要求表明,如果 Int64 null ,则需要将其映射到 -13 。如果类型是 Int64 ,我会尝试通过返回所述修复值来接近它。

public static Generic Get<Generic>(this object self)
{
  if (self == null && typeof (Generic) == typeof (long))
    return -13;

  try { return (Generic)self; }
  catch (Exception) { return default(Generic); }
}

但是,编译器不同意我的看法,因为它担心当 Generic 类型与所述值不兼容时,我将返回 -13 。我该如何解决?

我尝试使用谷歌搜索自定义默认值,但得到了nada。

2 个答案:

答案 0 :(得分:3)

您可以先将其object打包:

return (Generic)(object)-13;

然后,您将在编译时获得两个可接受的转换链。

答案 1 :(得分:2)

尝试这样做:

public static Generic Get<Generic>(this object self)
{
    return
        self == null && typeof(long) == typeof(Generic)
        ? (Generic)(object)-13L 
        : (Generic)self;
}

鉴于多种类型的扩展需求,这可行:

private static Dictionary<Type, Delegate> map = new Dictionary<Type, Delegate>()
{
    { typeof(long), (Func<object, long>)(o => o == null ? -13 : (long)o) },
    { typeof(float), (Func<object, float>)(o => o == null ? -13.0f : (float)o) },
    { typeof(double), (Func<object, double>)(o => o == null ? -13.0 : (double)o) },
};

public static Generic Get<Generic>(this object self)
{
    return
        map.ContainsKey(typeof(Generic))
            ? ((Func<object, Generic>)(map[typeof(Generic)]))(self)
            : (Generic)self;
}