暂时没有办法限制,我已经做过这类的开发了。也找过很多办法,给你参考一下 public T GetValue<T>(object value, T defaultvalue = default(T)) { if (value== null || value== DBNull.Value) { return defaultvalue; } return (T)value; }
public static T? DbValueTo<T>(object value) where T : struct { T? result = null; if (value != null && !(value is DBNull)) { result = (T?)Convert.ChangeType(value, typeof(T)); } return result; }
public class ConvertStruts { static ConvertStruts() { Cache<int>.Convert = (x) => Convert.ToInt32(x); Cache<long>.Convert = (x) => Convert.ToInt64(x); } private static class Cache<TResult> { public static Func<object, TResult> Convert; } public static T? DbValueTo<T>(object value) where T : struct { T? result = null; if (value != null && !(value is DBNull)) { result = Cache<T>.Convert(value); } return result; } } static void Main(string[] args) { var a = ConvertStruts.DbValueTo<int>("123"); }这样也行,这种更好。。但你要理解下
public class MyClass2<T> where T : struct//这个泛型类只接受值类型的泛型参数 { }
即使能够限制泛型参数是基元类型,也不可能调用T.Parse。我想楼主的本意是要将传入参数value转换为目标类型T,假如说value本身就是T类型的,就不用这么复杂,直接进行强制类型转换即可。 result = new Nullable<T>((T)value); 假如value有可能不是要转换的目标类型,那就要进行类型转换,关于类型转换有多种办法以下几个办法仅供参考。 1、使用Convert.ChangeType方法。 2、通过反射调用Parse方法。 3、使用TypeConverter。 可能依次尝试以上几种方法来实现类型转换。
泛型限制必须是接口、非密封类或者类型*class或者struct)。基本类型哪一种都不符合。.Net的类型系统并不允许从基本类型派生。所以不让你限制基本类型。但是你可以模拟一下,因为Int32是这么定义的 public struct Int32 : IComparable, IFormattable, IConvertible, IComparable<int>, IEquatable<int> 你可以这么写: where T:IComparable, IFormattable, IConvertible, IComparable<T>, IEquatable<T> 这样虽然没有达到你的要求,但是比where T:struct更严格一些。真要检测的话,你可以在调试版代码里检测typeof(T)之后碰见不支持的类型就抛异常。
{
if (value== null || value== DBNull.Value)
{
return defaultvalue;
}
return (T)value;
}
{
T? result = null;
if (value != null && !(value is DBNull))
{
result = (T?)Convert.ChangeType(value, typeof(T));
}
return result;
}
{
static ConvertStruts()
{
Cache<int>.Convert = (x) => Convert.ToInt32(x);
Cache<long>.Convert = (x) => Convert.ToInt64(x);
} private static class Cache<TResult>
{
public static Func<object, TResult> Convert;
} public static T? DbValueTo<T>(object value) where T : struct
{
T? result = null;
if (value != null && !(value is DBNull))
{
result = Cache<T>.Convert(value);
}
return result;
}
} static void Main(string[] args)
{
var a = ConvertStruts.DbValueTo<int>("123");
}这样也行,这种更好。。但你要理解下
public class MyClass2<T>
where T : struct//这个泛型类只接受值类型的泛型参数
{
}
result = new Nullable<T>((T)value);
假如value有可能不是要转换的目标类型,那就要进行类型转换,关于类型转换有多种办法以下几个办法仅供参考。
1、使用Convert.ChangeType方法。
2、通过反射调用Parse方法。
3、使用TypeConverter。
可能依次尝试以上几种方法来实现类型转换。
public struct Int32 : IComparable, IFormattable,
IConvertible, IComparable<int>, IEquatable<int>
你可以这么写:
where T:IComparable, IFormattable,
IConvertible, IComparable<T>, IEquatable<T>
这样虽然没有达到你的要求,但是比where T:struct更严格一些。真要检测的话,你可以在调试版代码里检测typeof(T)之后碰见不支持的类型就抛异常。