簡體   English   中英

轉換對象類型的最快方法是什么

[英]What is the fastest way to convert an Object type

我有一個將對象類型返回給變量的類。 變量必須對其執行操作時知道真實類型是什么:

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 : " "

像這樣使用它是可行的,但是我不確定這是否是最佳實現和/或最有效。 他們是這樣做的更好方法嗎?

老實說,在處理有限數量的可能結果時,您最好還是堅持使用switch語句。 我會做的就是改變您正在做的很多事情...

首先,不要對getter或setter進行任何復雜的操作。 您應該將它們推出一個單獨的方法:

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

其次,您無需強制使用case塊:

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

第三,

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

...這里有一些問題,例如:

temp.Count() > 0

...將導致整個枚舉被枚舉,這樣做的效率要高得多:

temp.Any()

...因為它將在遇到第一個元素next之后返回:

temp.FirstOrDefault().Data

如果要調用.Count() > 0 (或現在有希望.Any()您可以將其更改為.First()因為你已經確定,必須有一個實例為它打這個邏輯路徑。

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

因為您的方法可能返回字符串以外的類型,所以只能將完整的三次操作的結果分配給Object,因為編譯器不知道可以將其分配給哪種參數類型。...想象您正在返回Int32或一個String ,哪個?

更新現在我考慮一下,您應該做的一個非常重要的更改就是:

public object Data { get; set;}

該屬性實際上應該只返回原始數據。 您應該在模型的問題域之外顯示數據(並因此將其轉換為其他類型)。

看起來您實際上是將對象寫成html,那么為什么要進行格式化工作呢? 在大多數情況下,您可以使用.ToString()獲取對象的字符串表示形式:

temp.Any() ? temp.First().Data.ToString() : "nbsp;"

假設您的原始類型與目標類型兼容,則可以執行以下操作:

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屬性,用於將驗證要求附加到屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM