使用.NET Compact Framework进行通用和重载

时间:2015-03-19 00:16:06

标签: c# serialization compact-framework

请参阅下面的编辑,我的问题更简单了!

我想创建自己的序列化方法。

我有一个通用的参考资料我想序列化。这个通用引用有可能只是一个典型的值类型(single,int16等)。在这种情况下,我想调用适当的重载方法:BitConverter.GetBytes( genericRefThatIsACommonValueType ),而不需要进行类型检查(对于singleint16等)。

首先,我想知道我所问的是否可能(因为它看起来和感觉好多了)。其次,您认为有更好的方法来解决这类问题吗?感谢。

=========编辑==========

为什么方法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);
        }
    }
}

2 个答案:

答案 0 :(得分:1)

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;
        ...
}

答案 1 :(得分:0)

您可以使用反射来确定它是否是基本类型:

https://msdn.microsoft.com/en-us/library/system.type.isprimitive(v=vs.110).aspx

请记住,字符串不是值类型,因此如果您想要处理它,您将要检查字符串是否为字符串。但是,至少在那时它检查的次数要少得多。