我正在重构一些.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;
}
答案 0 :(得分:1)
由于System.String
是sealed
,因此表达式
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