我想寫一個通用的轉換函數,但我不知道我該怎麼做。這是我的骨架:如何編寫通用轉換函數?
public static T ConvertByGenerics<T>(string value)
{
//what do I write here?
return default(T);
}
有人可以幫我嗎?我在函數中寫入什麼來動態地將字符串轉換爲T類型?像
我想寫一個通用的轉換函數,但我不知道我該怎麼做。這是我的骨架:如何編寫通用轉換函數?
public static T ConvertByGenerics<T>(string value)
{
//what do I write here?
return default(T);
}
有人可以幫我嗎?我在函數中寫入什麼來動態地將字符串轉換爲T類型?像
試試:
public T ConvertByGenerics<T>(string value, T defaultValue)
{
if (!string.IsNullOrEmpty(value))
{
return (T)Convert.ChangeType(value, typeof(T));
}
return defaultValue;
}
你想要什麼是不可能的。
爲了支持任何可能的類型,你需要知道它是如何被表示爲一個字符串 - 一些內置的值類型有Parse
方法是「理解」串的某些格式,並可以把它解析爲類型,但是對於每種可能的類型絕對沒有辦法一般地做到這一點。
您需要編寫代碼將字符串轉換爲每種類型 - 這對於現有的每種類型都是不可行的。
還有更多的事情可以嘗試,但它們涉及動態方法。 代碼片段中沒有足夠的異常處理,當然可以進行一些優化。
public static T ConvertByGenerics<T>(string input) {
// be mindful of boxing
if (input is T) {
return (T)(object)input;
}
if (input == null) {
// throw arugment exception
}
// can check for int, long ......
if (typeof(T).IsEnum) {
return (T)System.Enum.Parse(typeof(T), input, true);
}
if (typeof(T).IsAssignableFrom(typeof(string))) {
return (T)(object)input;
}
try {
return (T)Convert.ChangeType(input, typeof(T));
}
catch { //do nothing
}
// might want to cache some converters
System.ComponentModel.TypeConverter converter = System.ComponentModel.TypeDescriptor.GetConverter(typeof(T));
if (converter.CanConvertFrom(typeof(string))) {
return (T)converter.ConvertFrom(input);
}
else {
// better though to throw an exception here
return default(T);
}
}
您希望_any_類型可以從字符串中解析出來嗎? – Oded
是的,有點。如果我說ConvertByGenerics(「10」),它應該給我10個整數。 –
Jack
你可以看到下面的帖子 http://stackoverflow.com/questions/6884653/how-to-make-a-generic-type-cast-function – Waqar