Как Протестировать, если Тип Примитивен

У меня есть блок кода, который сериализирует тип в тег HTML.

Type t = typeof(T); // I pass <T> in as a paramter, where myObj is of type T
tagBuilder.Attributes.Add("class", t.Name);
foreach (PropertyInfo prop in t.GetProperties())
{
    object propValue = prop.GetValue(myObj, null);
    string stringValue = propValue != null ? propValue.ToString() : String.Empty;
    tagBuilder.Attributes.Add(prop.Name, stringValue);
}

Это работает отлично, кроме я хочу, чтобы это только сделало это для типов примитивов, как int, double, bool и т.д., и другие типы, которые не примитивны, но могут быть сериализированы легко как string. Я хочу, чтобы это проигнорировало все остальное как Списки и другие пользовательские типы.

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

153
задан DaveDev 14 March 2010 в 15:38
поделиться

3 ответа

Можно использовать свойство Type. IsPrimitive, но будьте осторожны, потому что есть некоторые типы, которые мы можем считать примитивами, но это не так, например Decimal и String.

Edit 1: Добавлен пример кода

Вот пример кода:

if (t.IsPrimitive || t == typeof(Decimal) || t == typeof(String) || ... )
{
    // Is Primitive, or Decimal, or String
}

Edit 2: Как заметил @SLaks, есть и другие типы, которые, возможно, вы захотите рассматривать как примитивы. Я думаю, что вам придется добавлять эти вариации по одной.

Редактирование 3: IsPrimitive = (Boolean, Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64, IntPtr, UIntPtr, Char, Double и Single), Anther Primitive-Like type to check (t == typeof(DateTime))

171
ответ дан 23 November 2019 в 22:05
поделиться

Предполагая, что у вас есть такая сигнатура функции:

void foo<T>() 

Вы можете добавить общее ограничение, разрешающее только типы значений:

void foo<T>() where T : struct

Обратите внимание, что это не позволяет только примитивные типы для T, но любой тип значения.

3
ответ дан 23 November 2019 в 22:05
поделиться

Я только что нашел этот вопрос, когда искал аналогичное решение, и подумал, что вас может заинтересовать следующий подход с использованием System.TypeCode и System.Convert .

Легко сериализовать любой тип, отображаемый в System.TypeCode , отличный от System.TypeCode.Object , поэтому вы можете:

object PropertyValue = ...
if(Convert.GetTypeCode(PropertyValue) != TypeCode.Object)
{
    string StringValue = Convert.ToString(PropertyValue);
    ...
}

Преимущество этого подход заключается в том, что вам не нужно называть все остальные приемлемые непримитивные типы. Вы также можете немного изменить приведенный выше код для обработки любого типа, реализующего IConvertible.

52
ответ дан 23 November 2019 в 22:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: