有没有比Convert.ChangeType更笨拙的解决方案从HashTable获取值

时间:2013-03-01 12:15:42

标签: c# generics .net-4.0

我正在重构一些.NET 1.1代码,使其成为更易于维护的.NET 4.0代码,并了解代码的全面改进。

当前代码的很大一部分依赖于HashTable实例,这些实例基本上是一种属性包,包含简单值类型的值,如int / double / single和string。

围绕这些是大部分复制/粘贴代码进行转换的大部分,其中相当多的地方都是包含错误的“差不多”副本。

因此,我计划LoadValue函数,如下所示。

应用程序中的逻辑假设字符串永远不为空,并且总是被修剪 在我的下面的方法中,基于Convert.ChangeType,解决方案感觉“笨拙”,所以:

  • 这样做的方法不那么笨拙吗?
  • 我在这个方法中忽略了任何明显的事情吗?

    /// <summary>
    /// Centralize all the null/value behaviour for converting properties in bags to business object properties.
    /// </summary>
    /// <typeparam name="T">type to get; can be simple value type (int, double, etc) or string</typeparam>
    /// <param name="properties">HashTable to get property from</param>
    /// <param name="propertyName">name of property to get</param>
    /// <returns>default(T) if property does not have value, otherwise Trimmed value for string, or value for other types.</returns>
    protected T LoadValue<T>(Hashtable properties, string propertyName)
    {
        T result;
        bool haveValue = properties[propertyName] != null;
        Type genericType = typeof(T);
        Type stringType = typeof(string);
        if (genericType.IsSubclassOf(stringType))
        {
            string stringResult;
            if (haveValue)
                stringResult = ((string)properties[propertyName]).Trim();
            else
                stringResult = string.Empty;
            result = (T)Convert.ChangeType(stringResult, genericType); //(T)(stringResult);
        }
        else
        {
            if (haveValue)
                result = ((T)properties[propertyName]);
            else
                result = default(T);
        }
        return result;
    }
    

1 个答案:

答案 0 :(得分:1)

由于System.Stringsealed,因此表达式

genericType.IsSubclassOf(stringType)

相同
genericType==stringType

因此,您无需拨打Convert.ChangeType:您可以通过转发T来投射到object,如下所示:

object stringResult; // Note the change of type to "object"
if (haveValue)
    stringResult = ((string)properties[propertyName]).Trim();
else
    stringResult = string.Empty;
result = (T)stringResult; // It is allowed to cast object to generic T