получить тип объекта и назначить значения соответственно - PullRequest
5 голосов
/ 10 июля 2009

У меня есть массив, который получает различный тип значений , 1-е значение -> строка , 2-е значение-> datetime , 3-е значение-- > логическое и 4-е значение равно int , как мне найти их тип и назначить эти значения соответствующим образом, любая помощь приветствуется:)

вот мой код:

foreach (object obj in lstTop)
            {

              if(obj.GetType() == string)
                {do this...)
              else if(obj.GetType() == DateTime)
                {do this....}
              else if(obj.GetType() == bool)
                {do this....}
              else if(obj.GetType() == Int)
                {do this....}
            }

Спасибо всем, мой окончательный код:

string Subscription = "";
        DateTime issueFirst;
        DateTime issueEnd;

        foreach (object obj in lstTop)
        {
            ///Type t = obj.GetType();
            if (obj is string)
                Subscription += obj + ",";
            else if (obj is DateTime)
            {
               Subscription += Convert.ToDateTime(obj).ToShortDateString() + ",";
            }
           /// else if (t == typeof(DateTime))                
        }
    return ("User Authenticated user name: " + userName + ", Subscription: " + Subscription);

Ответы [ 7 ]

7 голосов
/ 10 июля 2009
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();
          }
        }
2 голосов
/ 10 июля 2009

ArrayLists в .Net 2.0 - почти всегда неправильный способ сделать это. Даже если вы не знаете, что будет в списке, вам лучше использовать универсальный List<Object>, потому что он сообщает другим, что список действительно может содержать что угодно, а не просто остаток от программиста .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);
1 голос
/ 14 февраля 2010

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

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

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

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

1 голос
/ 10 июля 2009

Если ваш список содержит ровно одно значение каждого типа, вы можете вместо этого сохранить его в Dictionary (если использование 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 голос
/ 10 июля 2009

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

string   myString = (string)   lstTop[0];
DateTime myDate   = (DateTime) lstTop[1];
bool     myBool   = (bool)     lstTop[2];
int      myInt    = (int)      lstTop[3];
0 голосов
/ 10 июля 2009
        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 голосов
/ 10 июля 2009

Просто немного чище код:

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

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

...