问题描述
写了这样一个泛型函数:publicstaticT?DbValueTo<T>(objectvalue)whereT:struct{T?result=null;if(value!=null&&!(valueisDBNull)){result=T.Parse(value.ToString());}returnresult;}
结果编译错误(CS0119):“T”是一个“类型形参”,这在给定的上下文中无效。函数的目的是把从数据库中读出的值转为int?、datetime?等类型,如果数据库中是空,则返回值也要是空。同时,由于要用同一段代码操作多个数据表,而有些数据表中类型定义得不规范,所以需要用Parse来进行转换。但是现在在T.Parse这一句出现了错误。
解决方案
解决方案二:
微软没有提供IParsable接口,只能换思路://result=T.Parse(value.ToString());改成下边这行result=Convert.ChangeType(value,typeof(T))asT?;
解决方案三:
这个不可以吧,基本类型都没有所谓的“父类”
解决方案四:
暂时没有办法限制,我已经做过这类的开发了。也找过很多办法,给你参考一下publicTGetValue<T>(objectvalue,Tdefaultvalue=default(T)){if(value==null||value==DBNull.Value){returndefaultvalue;}return(T)value;}
解决方案五:
publicstaticT?DbValueTo<T>(objectvalue)whereT:struct{T?result=null;if(value!=null&&!(valueisDBNull)){result=(T?)Convert.ChangeType(value,typeof(T));}returnresult;}
解决方案六:
publicclassConvertStruts{staticConvertStruts(){Cache<int>.Convert=(x)=>Convert.ToInt32(x);Cache<long>.Convert=(x)=>Convert.ToInt64(x);}privatestaticclassCache<TResult>{publicstaticFunc<object,TResult>Convert;}publicstaticT?DbValueTo<T>(objectvalue)whereT:struct{T?result=null;if(value!=null&&!(valueisDBNull)){result=Cache<T>.Convert(value);}returnresult;}}staticvoidMain(string[]args){vara=ConvertStruts.DbValueTo<int>("123");}
这样也行,这种更好。。但你要理解下
解决方案七:
publicclassMyClass2<T>whereT:struct//这个泛型类只接受值类型的泛型参数{}
解决方案八:
即使能够限制泛型参数是基元类型,也不可能调用T.Parse。我想楼主的本意是要将传入参数value转换为目标类型T,假如说value本身就是T类型的,就不用这么复杂,直接进行强制类型转换即可。result=newNullable<T>((T)value);假如value有可能不是要转换的目标类型,那就要进行类型转换,关于类型转换有多种办法以下几个办法仅供参考。1、使用Convert.ChangeType方法。2、通过反射调用Parse方法。3、使用TypeConverter。可能依次尝试以上几种方法来实现类型转换。
解决方案九:
泛型限制必须是接口、非密封类或者类型*class或者struct)。基本类型哪一种都不符合。.Net的类型系统并不允许从基本类型派生。所以不让你限制基本类型。但是你可以模拟一下,因为Int32是这么定义的publicstructInt32:IComparable,IFormattable,IConvertible,IComparable<int>,IEquatable<int>你可以这么写:whereT:IComparable,IFormattable,IConvertible,IComparable<T>,IEquatable<T>这样虽然没有达到你的要求,但是比whereT:struct更严格一些。真要检测的话,你可以在调试版代码里检测typeof(T)之后碰见不支持的类型就抛异常。