番号型から独立した一般的な番号操作を実行しようとしています。しかし、私はこれを行うためにジェネリックスを使用する方法がないことを知っています。最初の考えは、whereステートメントで入力タイプをフィルタリングすることでしたが、すべての数値タイプは閉じられているため、汎用フィルタには無効です。また、ジェネリックスでは標準的な数値演算(加算、シフトなど)ができないため、私が思いつく唯一の解決策は、非一般的に各メソッドを書き直すことです。他のアイデア?参考C#:汎用インターフェイス番号:
、以下は、私が最初に試みたコードである:
private const int BYTE_SIZE = 8;
private const int UINT16_SIZE = 16;
private const int UINT32_SIZE = 32;
private const int UINT64_SIZE = 64;
public static byte[] ToBytes(UInt16[] pnaValues)
{
return ToSmaller<byte, UInt16>(pnaValues, BYTE_SIZE, UINT16_SIZE);
}
public static byte[] ToBytes(UInt32[] pnaValues)
{
return ToSmaller<byte, UInt32>(pnaValues, BYTE_SIZE, UINT32_SIZE);
}
....
public static UInt16[] ToUInt16s(byte[] pnaValues)
{
return ToLarger<UInt16, byte>(pnaValues, UINT16_SIZE, BYTE_SIZE);
}
public static UInt16[] ToUInt16s(UInt32[] pnaValues)
{
return ToSmaller<UInt16, UInt32>(pnaValues, UINT16_SIZE, UINT32_SIZE);
}
...
public static UInt64[] ToUInt64s(UInt32[] pnaValues)
{
return ToLarger<UInt64, UInt32>(pnaValues, UINT64_SIZE, UINT32_SIZE);
}
private static TLarger[] ToLarger<TLarger, TSmaller>(TSmaller[] pnaSmaller, int pnLargerSize, int pnSmallerSize)
where TLarger : byte, UInt16, UInt32, UInt64
where TSmaller : byte, UInt16, UInt32, UInt64
{
TLarger[] lnaRetVal = null;
int lnSmallerPerLarger = pnLargerSize/pnSmallerSize;
System.Diagnostics.Debug.Assert((pnLargerSize % pnSmallerSize) == 0);
if (pnaSmaller != null)
{
System.Diagnostics.Debug.Assert((pnaSmaller % lnSmallerPerLarger) == 0);
lnaRetVal = new TLarger[pnaSmaller.Length/lnSmallerPerLarger];
for (int i = 0; i < lnaRetVal.Length; i++)
{
lnaRetVal[i] = 0;
for (int j = 0; j < lnSmallerPerLarger; j++)
{
lnaRetVal[i] = (lnaRetVal[i] << pnLargerSize) + pnaSmaller[i * lnSmallerPerLarger + j];
}
}
}
return lnaRetVal;
}
private static TSmaller[] ToSmaller<TSmaller, TLarger>(TLarger[] pnaLarger, int pnSmallerSize, int pnLargerSize)
where TSmaller : byte, UInt16, UInt32, UInt64
where TLarger : byte, UInt16, UInt32, UInt64
{
TSmaller[] lnaRetVal = null;
int lnSmallerPerLarger = pnLargerSize/pnSmallerSize;
System.Diagnostics.Debug.Assert((pnLargerSize % pnSmallerSize) == 0);
if (pnaSmaller != null)
{
lnaRetVal = new TSmaller[pnaLarger.Length * lnSmallerPerLarger];
for (int i = 0; i < lnaRetVal.Length; i++)
{
for (int j = 0; j < lnSmallerPerLarger; j++)
{
lnaRetVal[i * lnSmallerPerLarger + (lnSmallerPerLarger - 1 - j)]
= pnaLarger[i] >> (j * pnLargerSize);
}
}
}
return lnaRetVal;
}
特にこのケースでは、 'Operator.Convert(TFrom値)'が役に立ちます。 –
私は 'LeftShift'と' RightShift'を実装していませんが、追加するのは簡単ではないことに注意してください。 –