我上控制工作,可以採取多種不同的數據類型(任何實現IComparable的)的。一般類型的轉換,而不用擔心例外
我需要能夠在通過另一個變量來比較這些。
如果主數據類型是一個DateTime,和我通過一個字符串,我需要
- 嘗試轉換將字符串轉換爲日期時間以執行日期比較。
- 如果String不能轉換爲DateTime然後做一個字符串比較。
所以我需要一個通用的方法來嘗試從任何類型轉換爲任何類型。很簡單,.Net爲我們提供了TypeConverter類。
現在,我可以工作要做,以確定是否該字符串可以轉換爲DateTime最好是使用異常。如果ConvertFrom引發異常,我知道我無法進行轉換,必須進行字符串比較。
以下是我得到的最好:
string theString = "99/12/2009";
DateTime theDate = new DateTime (2009, 11, 1);
IComparable obj1 = theString as IComparable;
IComparable obj2 = theDate as IComparable;
try
{
TypeConverter converter = TypeDescriptor.GetConverter (obj2.GetType());
if (converter.CanConvertFrom (obj1.GetType()))
{
Console.WriteLine (obj2.CompareTo (converter.ConvertFrom (obj1)));
Console.WriteLine ("Date comparison");
}
}
catch (FormatException)
{
Console.WriteLine (obj1.ToString().CompareTo (obj2.ToString()));
Console.WriteLine ("String comparison");
}
我們工作國家標準部分,其中:
例外只應在異常情況下提出的 - 即。遇到錯誤。
但是,這不是一個特殊的情況。我需要另一種方式。
大多數變量類型有一個TryParse方法,它返回一個布爾值,讓你決定是否轉換成功與否。但是沒有TryConvert方法可用於TypeConverter。 CanConvertFrom只有當它是可能的這些類型之間的轉換和犯規考慮要轉換的實際數據dermines。 IsValid方法也沒用。
任何想法?
編輯
我不能使用AS和IS。我不知道編譯時的數據類型。所以我不知道該怎麼做,是!
編輯
好釘的私生子。它不像Marc Gravells那樣整潔,但它有效(我希望)。感謝Marc的啓發。當我得到時間的時候,我會整理它,但我有一堆錯誤修正,我必須得到。
public static class CleanConverter
{
/// <summary>
/// Stores the cache of all types that can be converted to all types.
/// </summary>
private static Dictionary<Type, Dictionary<Type, ConversionCache>> _Types = new Dictionary<Type, Dictionary<Type, ConversionCache>>();
/// <summary>
/// Try parsing.
/// </summary>
/// <param name="s"></param>
/// <param name="value"></param>
/// <returns></returns>
public static bool TryParse (IComparable s, ref IComparable value)
{
// First get the cached conversion method.
Dictionary<Type, ConversionCache> type1Cache = null;
ConversionCache type2Cache = null;
if (!_Types.ContainsKey (s.GetType()))
{
type1Cache = new Dictionary<Type, ConversionCache>();
_Types.Add (s.GetType(), type1Cache);
}
else
{
type1Cache = _Types[s.GetType()];
}
if (!type1Cache.ContainsKey (value.GetType()))
{
// We havent converted this type before, so create a new conversion
type2Cache = new ConversionCache (s.GetType(), value.GetType());
// Add to the cache
type1Cache.Add (value.GetType(), type2Cache);
}
else
{
type2Cache = type1Cache[value.GetType()];
}
// Attempt the parse
return type2Cache.TryParse (s, ref value);
}
/// <summary>
/// Stores the method to convert from Type1 to Type2
/// </summary>
internal class ConversionCache
{
internal bool TryParse (IComparable s, ref IComparable value)
{
if (this._Method != null)
{
// Invoke the cached TryParse method.
object[] parameters = new object[] { s, value };
bool result = (bool)this._Method.Invoke (null, parameters);
if (result)
value = parameters[1] as IComparable;
return result;
}
else
return false;
}
private MethodInfo _Method;
internal ConversionCache (Type type1, Type type2)
{
// Use reflection to get the TryParse method from it.
this._Method = type2.GetMethod ("TryParse", new Type[] { type1, type2.MakeByRefType() });
}
}
}
不是真的有問題知道什麼類型將被轉換爲。在這裏,我不。這個問題的答案根本不能幫助我。 – 2010-01-21 17:24:34
好。很公平。 – jason 2010-01-21 17:27:02
唷..我以爲我會讓我的問題關閉。我花了幾個小時在這一個.. ;-) – 2010-01-21 17:28:37