怎么限制泛型的类型参数为int、decimal、datetime等基本类型?

问题描述

写了这样一个泛型函数: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)之后碰见不支持的类型就抛异常。

时间: 2024-08-03 14:41:17

怎么限制泛型的类型参数为int、decimal、datetime等基本类型?的相关文章

c# 反射-C# 反射 判断属性是int 还是datetime

问题描述 C# 反射 判断属性是int 还是datetime 反射的时候,只有一个IsValueType判断是否是值类型,那我怎么来判断是int 还是bool,或者其他值类型呢 解决方案 static void Main(string[] args) { string s = ""BBEijing""; int a = 123; bool b = true; bool result = (s is string);//在这个地方改变就可以测试了. Console.W

MySQL时间字段究竟使用INT还是DateTime的说明_php技巧

今天解析DEDECMS时发现deder的MYSQL时间字段,都是用 `senddata` int(10) unsigned NOT NULL DEFAULT '0'; 随后又在网上找到这篇文章,看来如果时间字段有参与运算,用int更好,一来检索时不用在字段上转换运算,直接用于时间比较!二来如下所述效率也更高. 归根结底:用int来代替data类型,更高效. 环境: Windows XP PHP Version 5.2.9 MySQL Server 5.1 第一步.创建一个表date_test(非

MySQL时间字段究竟使用INT还是DateTime

今天发现deder的MYSQL时间字段,都是用 `senddata` int(10) unsigned NOT NULL DEFAULT '0'; 随后又在网上找到这篇文章,看来如果时间字段有参与运算,用int更好,一来检索时不用在字段上转换运算,直接用于时间比较!二来如下所述效率也更高. 归根结底:用int来代替data类型,更高效. 环境: Windows XP PHP Version 5.2.9 MySQL Server 5.1 第一步.创建一个表date_test(非定长.int时间)

泛型-java 类型参数 T extends SelfBounded&amp;amp;lt;T&amp;amp;gt;的T在运行时会被擦除成什么类型

问题描述 java 类型参数 T extends SelfBounded<T>的T在运行时会被擦除成什么类型 class SelfBounded> { T element; SelfBounded<T> set(T arg) { element = arg; return this; } T get() { return element; } } 请问类型参数 T extends SelfBounded的T在运行时会被擦除成什么类型 解决方案 类型擦除指的是通过类型参数合并,

一起谈.NET技术,asp.net控件开发基础(9)

写第五篇的时候,我一步步的加上元数据(特性),使得设计时效果更加好,如对复杂属性应用以下特性,使属性浏览器支持扩展/折叠效果,使你更加容易编辑子属性,但接着我又遇到了问题,所以必须去解决 1.认识默认属性浏览器支持 让我们再认识一下属性,大家知道每个属性都是有类型的,最熟悉就是string,int这些类型了,vs2005属性浏览器对这些属性类型进行了识别, 如下例子 (1)table控件的Height属性,当你设置属性为字符串时,则提示错误信息 (2)当属性类型为Color属性时,属性浏览器为你

C#泛型秘诀(8完)

4.13 初始化泛型变量为它们的默认值 问题 您的泛型类包含一个变量,它的类型和类中定义的类型参数一样.在构造泛型类时,您希望这个变量被初始化为它的默认值. 解决方案 简单地使用default关键字把变量初始化为它的默认值: public class DefaultValueExample<T> { T data = default(T); public bool IsDefaultData() { T temp = default(T); if (temp.Equals(data)) { r

泛型

 什么是Java泛型                1.java泛型是java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方法.                2.java泛型可以让你消除代码中的强制类型转换,同时获得一个附加的类型检查层,该检查层可以防止有人将错误类型的键或值保存在集合中.这就是泛型所做的工作. 为什么要有泛型 先来看看以下代码,        publi

J2SE5.0 实例---泛型

j2se 泛型简介 泛型其实并不是一种新的语言元素,C++中早就就有,但是在C++之后的java却没有吸收这个特性,现在Java也有了泛型的特性,大概也和.Net的竞争有关系吧. 首先看泛型的一个应用. 在过去,我们可能经常要写一些类似这样的代码: List stringList=new LinkedList(); stringList.add("firstString"); stringList.add("secondString"); String str=(S

C#2.0 Specification(泛型一)

这篇文章是翻译的微软的技术文章.供学习c#的朋友参考,请勿用于商业目的.http://msdn.microsoft.com/vcsharp/team/language/default.aspx由于这一章非常长可能需要分几篇:)20.泛型20.1泛型类声明泛型类声明是一个需要提供类型参数以形成实际类型的类的声明. 类声明可以有选择地定义类型参数. class-declaration: (类声明) attributesopt class-modifiersopt class identifierop