Самое близкое, которое можно получить, typeof
, но это только возвращает "объект" для любого вида пользовательского типа. Для тех см. Jason Bunting .
Редактирование, Jason удалил свое сообщение по некоторым причинам, поэтому просто используйте Объект constructor
свойство.
foreach (object obj in lstTop)
{
if(obj is string)
{do this.....}
else if(obj is DateTime)
{do this.....}
else if(obj is bool)
{do this.....}
else if(obj is Int)
{do this.....}
else
{
// always have an else in case it falls through
throw new Exception();
}
}
Списки массивов в .Net 2.0 почти всегда являются неправильным способом сделать это. Даже если вы не знаете, что будет содержать список, вам лучше использовать общий List
, потому что он сообщает другим, что список действительно может содержать что угодно, а не просто левый от программиста .Net 1.1.
Кроме этого, ключевое слово is
должно делать то, что вы хотите:
if (obj is string)
// do this
else if (obj is DateTime)
// do this
// ...
Обновление Я знаю, что это устарело, но оно появляется в моих уведомлениях сегодня. Прочитав его еще раз, мне пришло в голову, что еще один хороший способ сделать это - использовать разрешение типов для перегруженной функции:
void DoSomething(string value) { /* ... */ }
void DoSomething(DateTime value) { /* ... */ }
DoSomething(obj);
Самое простое решение - не использовать цикл, поскольку вы точно знаете что в твоем списке.
string myString = (string) lstTop[0];
DateTime myDate = (DateTime) lstTop[1];
bool myBool = (bool) lstTop[2];
int myInt = (int) lstTop[3];
Если ваш список содержит ровно одно значение каждого типа, вы можете сохранить его в Словаре
вместо этого (при использовании ArrayList
не является особым требованием ) и просто получить значение на основе запрошенного типа:
private Dictionary<Type, Object> data = GetDataList();
string myString = (string)data[typeof(string)];
int myInt = (int)data[typeof(int)];
Это сделает процесс выборки значений немного более надежным, поскольку он не зависит от значений, появляющихся в каком-либо конкретном порядке.
Пример преобразования ArrayList в такой словарь:
ArrayList data = new ArrayList();
data.Add(1);
data.Add("a string");
data.Add(DateTime.Now);
Dictionary<Type, Object> dataDictionary = new Dictionary<Type, object>();
for (int i = 0; i < data.Count; i++)
{
dataDictionary.Add(data[i].GetType(), data[i]);
}
Просто немного более чистый код:
foreach (object obj in lstTop)
{
if(obj is string)
{do this...)
else if(obj is DateTime)
{do this....}
else if(obj is bool)
{do this....}
else if(obj is int)
{do this....}
}
Если ваш массив всегда содержит одни и те же объекты в одном и том же местоположение, просто проиндексируйте массив и выполните прямое приведение.
foreach (object obj in lstTop)
{
if(obj.GetType() == typeof(string))
{do this...)
else if(obj.GetType() == typeof(DateTime))
{do this....}
else if(obj.GetType() == typeof(bool))
{do this....}
else if(obj.GetType() == typeof(int))
{do this....}
}
Метод GetType
возвращает System.Type
объекта. Поэтому вам нужно сравнить его с другим System.Type
, который вы получите, используя typeof
.
Вместо использования примитивных типов у меня был бы абстрактный класс, инкапсулирующий каждый тип данных. Затем логика обработки этого типа может быть встроена в сам класс.
foreach( MyBaseData data in lstData )
{
data.DoTheRightThing();
}
В общем, любой код, который включает тип объекта, следует рассматривать как запах дизайна - это не обязательно может быть неправильным, но, вероятно, было бы неплохо взглянуть на него еще раз.
Хотя написание класса для инкапсуляции простого типа может показаться ненужной работой, я не думаю, что когда-либо сожалел об этом.