Самый быстрый способ проверить, является ли тип преобразовываемым?

В моем сериализаторе/десериализаторе у меня есть следующий фрагмент:

    if (element_type.IsValueType && collection_type.IsArray)
    {
        try
        {
            GCHandle h = GCHandle.Alloc(array_object, GCHandleType.Pinned);
            int arrayDataSize = Marshal.SizeOf(element_type) * c.Count;
            var array_data = new byte[arrayDataSize];
            Marshal.Copy(h.AddrOfPinnedObject(), array_data, 0, arrayDataSize);
            h.Free();
            WriteByteArray(array_data);

            return;
        }
        catch (ArgumentException)
        {
            //if the value type is not blittable, then we need to serialise each array item one at a time
        }
    }

Целью которого является попытка записи массива типов значений в поток наиболее эффективным способом (то есть , просто содержимое в виде набора байтов).

Проблема возникает, когда тип является типом значения, но не преобразовывается, и Alloc() дает сбой. В этот момент перехватывается исключение и управление передается коду, который имеет дело с массив, как если бы он состоял из ссылочных типов.

Однако эта проверка (из-за генерации и перехвата исключения, которое, как я понимаю, происходит очень медленно) оказывается серьезным узким местом из-за количества типов значений, встречающихся в мое приложение. Итак, мне интересно, какой самый быстрый способ проверить, является ли тип преобразовываемым?

16
задан sebf 13 May 2012 в 19:42
поделиться