Jef*_*ege 6 c# generics iconvertible
我有一个非常丑陋的方法,它应该从数据库中提取各种数据,并使用它构造一个请求类型的对象.目标是将各种丑陋归结到一个地方,以便从包含此方法的类派生的类可以相对干净.
当它应该返回单个对象时,即使类型可以为空,我也没有问题:
protected T getValue<T>(ParameterObject myParameterObject)
{
var typeOfT = typeof (T);
if (typeOfT == typeof(bool))
{
string val = this.getValue(myParameterObject);
if (val == null)
return default(T);
bool rVal;
if (!Boolean.TryParse(val, out rVal))
return default(T);
return changeType<T>(rVal);
}
if (typeOfT == typeof (double?))
{
string val = this.getValue(myParameterObject);
if (val == null)
return default(T);
double rVal;
if (!Double.TryParse(val, out rVal))
return default(T);
return changeType<T>(rVal);
}
[...]
}
public static T changeType<T>(object value)
{
var t = typeof(T);
if (!t.IsGenericType || t.GetGenericTypeDefinition() != typeof(Nullable<>))
return (T)Convert.ChangeType(value, t);
if (value == null)
return default(T);
t = Nullable.GetUnderlyingType(t);
return (T)Convert.ChangeType(value, t);
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,我有一些情况,其中我想要的返回类型是IList,我想返回一个List:
protected T getValue<T>(ParameterObject myParameterObject)
{
var typeOfT = typeof (T);
if (typeOfT.IsGenericType)
{
if (typeOfT.GetGenericTypeDefinition() == typeof (IList<>))
{
var genericArgumentType = typeOfT.GenericTypeArguments.FirstOrDefault();
var baseType = typeof (List<>);
var genericType = baseType.MakeGenericType(new[] {genericArgumentType});
var rVal = Activator.CreateInstance(genericType);
[code to populate the list]
return changeType<T>(rVal);
}
[...]
}
Run Code Online (Sandbox Code Playgroud)
我无法返回一个rVal,因为它是一个对象,而不是T的实例.但是我的changeType()函数失败了,并出现错误:
System.InvalidCastException:Object必须实现IConvertible.
所以,我有一个泛型方法,返回类型是IList,我有一个List的对象,但我对它的引用是Object类型.如何投射它以便我可以从函数返回它?
您的return (T)Convert.ChangeType(value, t);线路失败是因为您的value对象未实现IConvertible.
来自MSDN 文档
[...] 为了成功转换, value 必须实现IConvertible接口,因为该方法只是包装对适当IConvertible方法的调用。该方法要求支持 value 到 conversionType 的转换。
要解决此问题,我不确定通用方法,但对于or类型value的特定情况,您可以尝试进行强制转换,然后执行linq 查询。通过递归地使用您的方法,这也应该处理嵌套的泛型类型。IEnumerableIEnumerable<>value.Select(x => changeType<ListGenT>(x))changeType
| 归档时间: |
|
| 查看次数: |
572 次 |
| 最近记录: |