GetOrDefault <t>而不依赖于InvalidCastException

时间:2015-12-14 17:23:59

标签: c# generics casting

我试图找到一种方法来获得一个检索设置值并将其转换为泛型类型的泛型方法。我非常希望避免在强制转换失败时获得第一次机会InvalidCastException。

这里有一些有效的代码,但在演员失败时包含第一次机会异常:

T IAppSettings.Get<T>(string settingKey)
{
  if (!ContainsSetting(settingKey))
    return default(T);

  var val = ConfigurationManager.AppSettings[settingKey];
  try
  {
    return (T)Convert.ChangeType(val, typeof(T));
  }
  catch (InvalidCastException)
  {
    return default(T);
  }
}

这就是我希望做的事情,但AS命令似乎不适用于泛型:

T IAppSettings.Get<T>(string settingKey)
{
  if (!ContainsSetting(settingKey))
    return default(T);

  var val = ConfigurationManager.AppSettings[settingKey];
  var result = val as T;  //invalid code - Parameter T cannot be used with 'as' operator

  return result ?? default(T);
}

是否有任何可以避免例外的工作方案?

1 个答案:

答案 0 :(得分:3)

您需要在方法的声明中添加where T : class

背后的原因是按照规范: 在e形式的操作中,e必须是表达式,T必须是引用类型。现在为了实现这一点,你需要告诉编译器你的T将是一个引用类型(例如一个类)。