Создайте ненулевой экземпляр любого типа числа / примитивного значения, заданного типом в C #

1

Допустим, у вас есть Type называемый primitiveType с primitiveType.IsPrimitive == true, как вы можете наиболее сукцинивно (без использования сторонней библиотеки) создать экземпляр этого с ненулевым значением (например, value = 1)?

То есть, функция может выглядеть так:

public static object CreateNonZero(Type primitiveType)
{
    if (!primitiveType.IsPrimitive)
    { throw new ArgumentException("type must be primitive"); }

    // TODO
}

То есть он должен работать для всех примитивных типов значений, например, bool, byte, sbyte, short, ushort, int, uint, long, ulong, float, double, IntPtr, UIntPtr, char и т.д.

Теги:
reflection

1 ответ

9
Лучший ответ
Convert.ChangeType(1, primitiveType)

Обратите внимание, что если вы хотите, чтобы возвращаемый тип соответствовал вашему фактическому типу, а не object, относительно легко сделать общую версию:

public static T CreateNonZero<T>()
{
    return (T)Convert.ChangeType(1, typeof(T));
}

Если вы хотите обрабатывать IntPtr и UIntPtr, я не знаю более элегантного способа, чем проверять тип явно

public static object CreateNonZero(Type type)
{
    if(type == typeof(IntPtr))
        return new IntPtr(1);
    if(type == typeof(UIntPtr))
        return new UIntPtr(1);
    return Convert.ChangeType(1, type);
}
  • 0
    Было бы более уместно в этом случае выполнять обычное приведение, а не использовать оператор as ? Т.е. return (T) Convert.ChangeType( 1, typeof( T ) ) . Я не могу вспомнить, что происходит, когда T неограничен и используется оператор as (поскольку T может быть типом значения).
  • 0
    @ Кайл, я думаю, ты прав, я обновил ответ
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню