如何在C#上将内置结构转换为参数类型T?

时间:2011-01-05 22:58:05

标签: c# casting

我正在编写一种方法,以便在控制台上为用户查询内容并获得他的答案......就像这样:

static T query<T>(String queryTxt)
    {
        Console.Write("{0} = ", queryTxt);
        T result;
        while (true)
        {
            try
            {
                result = // here should go the type casting of Console.ReadLine();
            }
            catch (FormatException e)
            {
                Console.WriteLine("Exception: {0};\r\nSource: {1}", e.Message, e.Source);
                continue;
            }
            break;
        }
        return result;
    }

简而言之,此方法应继续询问queryTxt的值,其中T始终为intdouble ...

有什么好方法吗?

提前致谢!

3 个答案:

答案 0 :(得分:2)

如果它总是int或double使用double.Parse并且它将始终有效。

答案 1 :(得分:2)

使用type converters

public static T Query<T>() {
    var converter = TypeDescriptor.GetConverter(typeof (T));
    if (!converter.CanConvertFrom(typeof(String)))
        throw new NotSupportedException("Can not parse " + typeof(T).Name + "from String.");

    var input = Console.ReadLine();

    while (true) {
        try {
            // TODO: Use ConvertFromInvariantString depending on culture.
            return (T)converter.ConvertFromString(input);
        } catch (Exception ex) {
            // ...
        }
    }
}

答案 2 :(得分:1)

概括它的一种方法是将转换函数作为委托传递。类似的东西:

T query<T>(string text, Func<string, T> converter)
{... result = converter(Console.Readline())...}
query("foo", s=>Int.Parse(s));

对于更通用的方法 - 请阅读“广义类型转换” “http://msdn.microsoft.com/en-us/library/yy580hbd.aspx及相关文章。