转换Object类型的最快方法是什么

时间:2010-08-05 22:20:08

标签: c# asp.net-mvc-2

我有一个类,它将对象类型返回给变量。变量必须知道在对其执行操作时实际类型是什么:

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 个答案:

答案 0 :(得分:1)

老实说,看到你处理有限数量的可能结果,你可能会坚持使用switch语句。我会做的是改变你正在做的很多事情......

首先,不要对getter或setter进行任何复杂的操作。你应该把它们推到一个单独的方法:

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以外的类型,所以完整的三次操作的结果只能分配给Object,因为编译器不知道它可以分配给哪个参数类型....想象你要返回Stringpublic object Data { get; set;} ,哪一个?

<强>更新 现在我想一想,你应该做的一个非常重要的改变就是:

.ToString()

该属性应该只返回原始数据。它应该在您呈现数据的模型的问题域之外(并因此将其转换为其他类型)。

看起来你基本上是把对象写成html,那么为什么所有的工作都要用格式化呢?在大多数情况下,您可以使用temp.Any() ? temp.First().Data.ToString() : "nbsp;" 来获取对象的字符串表示形式:

{{1}}

答案 1 :(得分:0)

假设您的原始类型与目标类型兼容,您可以执行以下操作:

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

(或者如果你有不需要IFormatProvider的Convert.ChangeType重载)

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属性,用于将验证要求附加到属性。