получите тип объекта и присвойте значения соответственно

Самое близкое, которое можно получить, typeof , но это только возвращает "объект" для любого вида пользовательского типа. Для тех см. Jason Bunting .

Редактирование, Jason удалил свое сообщение по некоторым причинам, поэтому просто используйте Объект constructor свойство.

5
задан John Saunders 14 February 2010 в 03:47
поделиться

7 ответов

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();
          }
        }
7
ответ дан 13 December 2019 в 05:40
поделиться

Списки массивов в .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);
2
ответ дан 13 December 2019 в 05:40
поделиться

Самое простое решение - не использовать цикл, поскольку вы точно знаете что в твоем списке.

string   myString = (string)   lstTop[0];
DateTime myDate   = (DateTime) lstTop[1];
bool     myBool   = (bool)     lstTop[2];
int      myInt    = (int)      lstTop[3];
1
ответ дан 13 December 2019 в 05:40
поделиться

Если ваш список содержит ровно одно значение каждого типа, вы можете сохранить его в Словаре вместо этого (при использовании 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]);
}
1
ответ дан 13 December 2019 в 05:40
поделиться

Просто немного более чистый код:

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....}
        }

Если ваш массив всегда содержит одни и те же объекты в одном и том же местоположение, просто проиндексируйте массив и выполните прямое приведение.

0
ответ дан 13 December 2019 в 05:40
поделиться
        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 .

0
ответ дан 13 December 2019 в 05:40
поделиться

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

foreach( MyBaseData data in lstData )
{
    data.DoTheRightThing();
}

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

Хотя написание класса для инкапсуляции простого типа может показаться ненужной работой, я не думаю, что когда-либо сожалел об этом.

1
ответ дан 13 December 2019 в 05:40
поделиться
Другие вопросы по тегам:

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