.NET Compact Framework 的泛型和重载
Generic and Overloads with .NET Compact Framework
请看下面的编辑,我把问题简单多了!
我想创建自己的序列化方法。
我有一个要序列化的通用参考。这个通用引用有可能只是一个典型的值类型(single、int16 等)。在那种情况下,我只想调用适当的重载方法:BitConverter.GetBytes( genericRefThatIsACommonValueType )
而不诉诸类型检查(对于 single
或 int16
等)。
首先,我想知道我的要求是否可行(因为它看起来和感觉起来会好很多)。其次,您认为有更好的方法来解决此类问题吗?谢谢
========= 编辑 ==========
为什么 bar() 方法无法编译,当我检查数据具有 BitConverter.GetBytes(..) 应该在其重载中支持的类型时。我能得到与此类似的东西吗?
public class foo<T>
{
T data;
public foo(T arg)
{
data = arg;
}
public void bar()
{
if(data.GetType() == typeof(int) || data.GetType()== typeof(float))
{
BitConverter.GetBytes(data);
}
}
}
您可以使用反射来确定它是否是原始类型:
https://msdn.microsoft.com/en-us/library/system.type.isprimitive(v=vs.110).aspx
请记住,字符串不是值类型,因此如果您想处理它,您需要检查它是否是一个字符串。但是,至少在那个时候,检查要少得多。
bar()
方法的问题是你知道它是BitConverter.GetBytes()
支持的类型,但data
仍然是类型T 没有约束。如果有 BitConverter.GetBytes<T>()
方法,它会起作用。
恐怕您必须手动覆盖每个重载:
switch (Type.GetTypeCode(typeof(T)))
{
case TypeCode.Int32:
BitConverter.GetBytes((Int32)data);
break;
case TypeCode.Int64:
BitConverter.GetBytes((Int64)data);
break;
...
}
请看下面的编辑,我把问题简单多了!
我想创建自己的序列化方法。
我有一个要序列化的通用参考。这个通用引用有可能只是一个典型的值类型(single、int16 等)。在那种情况下,我只想调用适当的重载方法:BitConverter.GetBytes( genericRefThatIsACommonValueType )
而不诉诸类型检查(对于 single
或 int16
等)。
首先,我想知道我的要求是否可行(因为它看起来和感觉起来会好很多)。其次,您认为有更好的方法来解决此类问题吗?谢谢
========= 编辑 ==========
为什么 bar() 方法无法编译,当我检查数据具有 BitConverter.GetBytes(..) 应该在其重载中支持的类型时。我能得到与此类似的东西吗?
public class foo<T>
{
T data;
public foo(T arg)
{
data = arg;
}
public void bar()
{
if(data.GetType() == typeof(int) || data.GetType()== typeof(float))
{
BitConverter.GetBytes(data);
}
}
}
您可以使用反射来确定它是否是原始类型:
https://msdn.microsoft.com/en-us/library/system.type.isprimitive(v=vs.110).aspx
请记住,字符串不是值类型,因此如果您想处理它,您需要检查它是否是一个字符串。但是,至少在那个时候,检查要少得多。
bar()
方法的问题是你知道它是BitConverter.GetBytes()
支持的类型,但data
仍然是类型T 没有约束。如果有 BitConverter.GetBytes<T>()
方法,它会起作用。
恐怕您必须手动覆盖每个重载:
switch (Type.GetTypeCode(typeof(T)))
{
case TypeCode.Int32:
BitConverter.GetBytes((Int32)data);
break;
case TypeCode.Int64:
BitConverter.GetBytes((Int64)data);
break;
...
}