我有一个内部泛型方法byte[] catchAllOperation<T>(T genericItem)和另一个byte[] arrayOperation<T>(T[] genericArray).另外,我有一个高度专业化的操作byte[] specializedOperation<TKey,TValue>(CustomMap<Tkey,TValue> customMap).
怎么写这样的方法?(伪):
public byte[] universalOperation<T>(T anything){
if(T is CustomMap<UKey,UValue>){ // UKey/UValue are unknown
return specializedOperation<UKey,UValue>(anything);
} else if(T is U[]){ // U is unknown
return arrayOperation<U>(anything);
}else{
return catchAllOperation<T>(anything);
}
}
Run Code Online (Sandbox Code Playgroud)
如何获得U以及如何调用arrayOperation<U>(anything);带有U如果我有只T(与同为CustomMap<>)?我所看到的大多数问题都假设U已经知道了.序列化程序使用反射为每个具体类型构造单独的方法,然后缓存该方法.但是在这里我只想在我能够检测到这些情况时,将通用方法重定向/发送到特殊情况.
我将有更多类似的类型CustomMap,因此有时间对代码/方法进行任何根本性的更改.所有特殊方法都利用了这样一个事实:对于blittable底层类型,一些转换和自定义布局显着提高了自定义类型的压缩率.对于自定义类型,我可以实现一个接口,但对于通用数组,它不是一个选项.
你的问题对我来说并不完全清楚,但听起来你基本上需要typeof(T)反思.幸运的是,C#中的动态类型意味着您可以让编译器团队进行艰苦的工作 - 诚然,在执行时:
// Note: all names changed to be more conventional
public byte[] UniversalOperation<T>(T value)
{
dynamic d = value;
return DynamicOperation(d);
}
private byte[] DynamicOperation<UKey, UValue>(CustomMap<UKey, UValue> map)
{
// Do stuff with the map here
}
private byte[] DynamicOperation<U>(U[] array)
{
// Do something with the array here
}
private byte[] DynamicOperation(object value)
{
// Fallback
}
Run Code Online (Sandbox Code Playgroud)
请注意,您的UniversalOperation方法现在不必是通用的 - 它只使用值的执行时类型.当然,这意味着它可能不是很为您最初的预期-例如,如果该值null,你就麻烦了-而你可能会潜在合作过typeof(T),尽管这一点.在不知道你想要实现什么的情况下,我们无法分辨这是否是一个问题.