Какой самый быстрый способ конвертировать тип объекта - PullRequest
1 голос
/ 06 августа 2010

У меня есть класс, который возвращает тип объекта в переменную.Переменная Должна знать, что является реальным типом, когда над ним выполняются операции:

public object Data 
    {
        get
        {
            switch (CriteriaID)
            {
                case (int)matrix2.enums.NodeTypeEnums.Enums.MultiLineText:
                    return (string)_Data;
                case (int)matrix2.enums.NodeTypeEnums.Enums.SingleLineText:
                    return (string)_Data;
                case (int)matrix2.enums.NodeTypeEnums.Enums.Number:
                    int temp = 0;
                    return int.TryParse((string)_Data, out temp) ? (int?)temp : null;
                case (int)matrix2.enums.NodeTypeEnums.Enums.Price:
                    decimal temp1 = 0;
                    return decimal.TryParse((string)_Data, out temp1) ? (decimal?)temp1 : null;
                case (int)matrix2.enums.NodeTypeEnums.Enums.PullDown:
                    return (string)_Data;
                case (int)matrix2.enums.NodeTypeEnums.Enums.Checkbox:
                    bool temp2 = false;
                    return bool.TryParse((string)_Data, out temp2) ? (bool?)temp2 : null;
                case (int)matrix2.enums.NodeTypeEnums.Enums.Date:
                    DateTime temp3 = DateTime.MinValue;
                    return DateTime.TryParse((string)_Data, out temp3) ? ((DateTime?)temp3).Value.ToString("MM/dd/yyyy") : null;
                case (int)matrix2.enums.NodeTypeEnums.Enums.Link:
                    return (string)_Data;
                case (int)matrix2.enums.NodeTypeEnums.Enums.Image:
                    return (string)_Data;
                default:
                    return (string)_Data;
            }
        }
        set
        {
            _Data = value;   
        }
    }

Свойство data используется следующим образом:

temp.Count() > 0 ? temp.FirstOrDefault().Data : " "

Использование этого так работает, но яне уверен, что это лучшая реализация и / или самая эффективная.Это лучший способ сделать это?

Ответы [ 2 ]

1 голос
/ 06 августа 2010

Честно говоря, учитывая, что вы имеете дело с конечным числом возможных результатов, вы с тем же успехом можете использовать оператор switch. Я бы изменил многое из того, что ты делаешь ...

Во-первых, не выполняйте сложные операции с геттерами или сеттерами. Вы должны выдвинуть это к отдельному методу:

public object Data
{
  get
  {
    return FormatData(_Data);
  }
}

Во-вторых, вам не нужно разыгрывать блоки:

case (int)matrix2.enums.NodeTypeEnums.Enums.MultiLineText:

В-третьих,

temp.Count() > 0 ? temp.FirstOrDefault().Data : " "

... здесь есть несколько вопросов, например:

temp.Count() > 0

... приведет к перечислению всего перечисляемого, что гораздо эффективнее сделать:

temp.Any()

... поскольку он вернется после того, как встретит первый элемент, следующий:

temp.FirstOrDefault().Data

если вы звоните .Count() > 0 (или теперь, надеюсь, .Any()), вы можете изменить это значение на .First(), так как вы уже установили, что должен существовать экземпляр для его обращения по этому логическому пути. *

temp.FirstOrDefault().Data : "&nbsp";

Поскольку ваш метод потенциально возвращает типы, отличные от строки, результат полной третичной операции может быть присвоен только объекту, поскольку компилятор не будет знать, какому типу аргумента он может быть назначен .... представьте, что вы возвращаете Int32 или String, какой?

UPDATE Теперь я думаю об этом, действительно важное изменение, которое вы должны сделать, это просто:

public object Data { get; set;}

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

Похоже, что вы, по сути, записываете объект в html, так зачем вся работа по его форматированию? По большей части вы можете использовать .ToString(), чтобы получить строковое представление объекта:

temp.Any() ? temp.First().Data.ToString() : "nbsp;"
0 голосов
/ 06 августа 2010

Предполагая, что ваш тип источника совместим с типом назначения, вы можете сделать что-то вроде этого:

public T ConvertValue<T>(object value)
{
    return (T)Convert.ChangeType(value, typeof(T), null);
}

(или если у вас есть перегрузка Convert.ChangeType, которая не требует IFormatProvider)

public T ConvertValue<T>(object value)
{
    return (T)Convert.ChangeType(value, typeof(T));
}

А затем использовать его, выполнив

int myValueConvertedToInt = ConvertValue<int>("12345");

Однако, если типы несовместимы, т. Е. Вы пытаетесь что-то вроде

int myValueConvertedToInt = ConvertValue<int>("XXX");

Будет выброшено.Поэтому вы захотите провести строгую проверку свойств, которые вы пытаетесь преобразовать.Я неравнодушен к атрибутам System.ComponentModel.DataAnnotations для добавления требований проверки к свойствам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...