2012-05-04 52 views
0

我想写一个通用的转换函数,但我不知道我该怎么做。这是我的骨架:如何编写通用转换函数?

public static T ConvertByGenerics<T>(string value) 
     { 
      //what do I write here? 
      return default(T); 
     } 

有人可以帮我吗?我在函数中写入什么来动态地将字符串转换为T类型?像

+0

您希望_any_类型可以从字符串中解析出来吗? – Oded

+0

是的,有点。如果我说ConvertByGenerics (“10”),它应该给我10个整数。 – Jack

+0

你可以看到下面的帖子 http://stackoverflow.com/questions/6884653/how-to-make-a-generic-type-cast-function – Waqar

回答

2

试试:

public T ConvertByGenerics<T>(string value, T defaultValue) 
{ 
    if (!string.IsNullOrEmpty(value)) 
    { 
     return (T)Convert.ChangeType(value, typeof(T)); 
    } 

    return defaultValue; 
} 
+0

优秀!只需要删除属性。我不知道那是什么! – Jack

+3

对于大多数类型,这将会失败并导致无效投射。 – Oded

+0

@Oded:这个答案是我想要的!我只需要简单的转换。不希望在字符串中创建像Person/Employee这样的复杂对象类型。我不确定谁低估了这个答案。 – Jack

0

你想要什么是不可能的。

为了支持任何可能的类型,你需要知道它是如何被表示为一个字符串 - 一些内置的值类型有Parse方法是“理解”串的某些格式,并可以把它解析为类型,但是对于每种可能的类型绝对没有办法一般地做到这一点。

您需要编写代码将字符串转换为每种类型 - 这对于现有的每种类型都是不可行的。

+0

请阅读devdigital的回答。 – Jack

+0

@TomKaufmann - 试试吧。祝你好运。它不适用于_most_类型。 – Oded

+0

它适用于我的情况。我只需要简单的转换。显然,我不能传递一个Person/Employee类型,并期望Person/Employee对象不在字符串中:p。 – Jack

1

还有更多的事情可以尝试,但它们涉及动态方法。 代码片段中没有足够的异常处理,当然可以进行一些优化。

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); 
    } 
}