以下代码会出问题:
public static T Protect<T>(Func<T> func, UserLevel pageRole) where T : ActionResult, new()
{
try
{
return func();
}
catch (Exception err)
{
if (typeof(T) is JsonResult)
{
return (T)new JsonResult() ;}
else if (typeof(T) is ActionResult)
{
return (T)new ContentResult();
}throw err;
}
}
得到 Cannot convert type 'JsonResult' to 'T',应该修正为:
return (T)(object)new JsonResult();
Well, you can always placate the compiler by adding an object
cast in the middle:
geoConfigs = (T)(object)GetGeoConfigurationNumericFromDB(items, maMDBEntities);
which will defer the type-check until runtime. However! There is no compiler way to do this otherwise, as it is never going to be happy with string tests like "MamConfiguration"
. Also, generics work well when the code is ... generic - i.e. does the same thing which each type. The code shown is the opposite of generic. It is non-generic code exposed through a generic API. It is always going to be messy inside. Personally I would try to avoid this usage in the first place.
或者:
You should be able to just use Convert.ChangeType()
instead of your custom code:
public T Get<T>(Stats type) where T : IConvertible
{
return (T) Convert.ChangeType(PlayerStats[type], typeof(T));
}