У меня есть блок кода, который сериализирует тип в тег 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
. Я хочу, чтобы это проигнорировало все остальное как Списки и другие пользовательские типы.
Кто-либо может предложить, как я делаю это? Или я должен указать типы, которые я хочу позволить где-нибудь и включить тип свойства, чтобы видеть, позволяется ли он? Это немного грязно, таким образом, это было бы хорошо если я, там был более опрятный путь.
Можно использовать свойство 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))
Предполагая, что у вас есть такая сигнатура функции:
void foo<T>()
Вы можете добавить общее ограничение, разрешающее только типы значений:
void foo<T>() where T : struct
Обратите внимание, что это не позволяет только примитивные типы для T, но любой тип значения.
Я только что нашел этот вопрос, когда искал аналогичное решение, и подумал, что вас может заинтересовать следующий подход с использованием System.TypeCode
и System.Convert
.
Легко сериализовать любой тип, отображаемый в System.TypeCode
, отличный от System.TypeCode.Object
, поэтому вы можете:
object PropertyValue = ...
if(Convert.GetTypeCode(PropertyValue) != TypeCode.Object)
{
string StringValue = Convert.ToString(PropertyValue);
...
}
Преимущество этого подход заключается в том, что вам не нужно называть все остальные приемлемые непримитивные типы. Вы также можете немного изменить приведенный выше код для обработки любого типа, реализующего IConvertible.