Допустим, у вас есть 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 и т.д.
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);
}
as
? Т.е.return (T) Convert.ChangeType( 1, typeof( T ) )
. Я не могу вспомнить, что происходит, когдаT
неограничен и используется операторas
(посколькуT
может быть типом значения).