正如阿利奥斯塔所说,您尝试做的事情不再是通用的,最好只使用重载。看起来您正在尝试执行类似于 C++ 中的模板专业化的操作,其中根据泛型类型调用不同的方法。
这是一个示例,其中我使用反射实现了一种通用专业化,如果重载方法不适合您,您也许可以应用类似的模式。如果你可以缓存反射的结果并且只调用一次GetMethod,那么结果并不会太慢。在 T 泛型类中,有一个方法调用:
if (_serializeDataToStream == null)
_serializeDataToStream = (Action<BinaryWriter, int, T[]>)GetTypeSpecificSerializationMethod();
_serializeDataToStream(writer, _size, _data);
其中 GetTypeSpecific 方法使用反射来创建委托
/// <summary>
/// Returns a delegate that points at the static type specific serialization method
/// </summary>
/// <returns></returns>
private Delegate GetTypeSpecificDeserializationMethod()
{
if (typeof(T) == typeof(double))
{
MethodInfo method = this.GetType().GetMethod("DeserializeDouble", BindingFlags.Static | BindingFlags.NonPublic);
return Delegate.CreateDelegate(typeof(Action<BinaryReader, int, T[]>), method);
}
else if (typeof(T) == typeof(ushort))
{
MethodInfo method = this.GetType().GetMethod("DeserializeUshort", BindingFlags.Static | BindingFlags.NonPublic);
return Delegate.CreateDelegate(typeof(Action<BinaryReader, int, T[]>), method);
}
else if (typeof(T) == typeof(DateTime))
{
MethodInfo method = this.GetType().GetMethod("DeserializeDateTime", BindingFlags.Static | BindingFlags.NonPublic);
return Delegate.CreateDelegate(typeof(Action<BinaryReader, int, T[]>), method);
}
else if (typeof(T) == typeof(bool))
{
MethodInfo method = this.GetType().GetMethod("DeserializeBool", BindingFlags.Static | BindingFlags.NonPublic);
return Delegate.CreateDelegate(typeof(Action<BinaryReader, int, T[]>), method);
}
throw new NotImplementedException("No deserialization method has been setup for type " + typeof(T).FullName);
}
/// <summary>
/// Serialize double[] to BinaryWriter
/// </summary>
/// <param name="writer"></param>
/// <param name="size"></param>
/// <param name="data"></param>
private static void SerializeDouble(BinaryWriter writer, int size, double[] data)
{
for (int i = 0; i < size; i++)
{
writer.Write(data[i]);
}
}