C#泛型:将泛型类型转换为值类型

前端之家收集整理的这篇文章主要介绍了C#泛型:将泛型类型转换为值类型前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个通用的类可以保存指定类型T的值.
该值可以是int,uint,double或float.
现在我想得到值的字节来将其编码成一个特定的协议.
因此,我想使用BitConverter.GetBytes()方法,但不幸的是Bitconverter不支持泛型类型或未定义的对象.这就是为什么我要转换该值并调用GetBytes()的特定重载.
我的问题:
如何将泛型值转换为int,double或float?
这不行:
  1. public class GenericClass<T>
  2. where T : struct
  3. {
  4. T _value;
  5.  
  6. public void SetValue(T value)
  7. {
  8. this._value = value;
  9. }
  10.  
  11. public byte[] GetBytes()
  12. {
  13. //int x = (int)this._value;
  14. if(typeof(T) == typeof(int))
  15. {
  16. return BitConverter.GetBytes((int)this._value);
  17. }
  18. else if (typeof(T) == typeof(double))
  19. {
  20. return BitConverter.GetBytes((double)this._value);
  21. }
  22. else if (typeof(T) == typeof(float))
  23. {
  24. return BitConverter.GetBytes((float)this._value);
  25. }
  26. }
  27. }

是否有可能投出一般的价值?
还是有另一种方式来获取字节?

解决方法

首先,这是一个非常糟糕的代码气味.任何时候,您对类型参数进行类型测试,像这样可能性很好,你滥用泛型.

C#编译器知道你以这种方式滥用泛型,并且不允许将类型为T的值转换为int等.您可以通过在将其转换为int之前将值转换为对象来关闭编译器:

  1. return BitConverter.GetBytes((int)(object)this._value);

呸.再次,找到另一种方法来做到这一点会更好.例如:

  1. public class NumericValue
  2. {
  3. double value;
  4. enum SerializationType { Int,UInt,Double,Float };
  5. SerializationType serializationType;
  6.  
  7. public void SetValue(int value)
  8. {
  9. this.value = value;
  10. this.serializationType = SerializationType.Int
  11. }
  12. ... etc ...
  13.  
  14. public byte[] GetBytes()
  15. {
  16. switch(this.serializationType)
  17. {
  18. case SerializationType.Int:
  19. return BitConverter.GetBytes((int)this.value);
  20. ... etc ...

没有必要的泛型为实际上是通用的情况保留泛型.如果您为每种类型编写了四次代码,那么您没有获得任何泛型的代码.

猜你在找的C#相关文章