如何获取字符串并返回数据类型的选择

时间:2013-11-29 21:39:41

标签: c# casting

在我的函数中,我正在获取一个字符串。

但是,我想使用相同的函数返回int,bool或字符串。假设我通过其他功能获得了一个字符串:

    public object read(string whatstring, string returnhow="string") {

    object result = "a string gotten from another function";

    switch(returnhow){
        case "int":
            result = int.TryParse(result, out result); break;
            case "bool":
                if (result=="0" || result=="false" || result=="") { returnthis = false; } else { returnthis = true; }; break;
        default:
            result = result.ToString(); break;
    }
    return result;
}

我想这样称呼它:

string thisvar = read("300", "int");
//or
bool thisvar = read("true", "string");

我不认为这是对的。我可以解决它,还是我走错了方向?

我确实得到了一个错误,我想因为我调用函数的方式 - 但你知道我想要什么。我希望它作为我声明返回值的type返回。也许我的方向错了?

Cannot implicitly convert type 'object' to 'string'. An explicit conversion exists (are you missing a cast?)

4 个答案:

答案 0 :(得分:3)

使用此功能。

public T ChangeType<T>(object value) 
{
    var converter = TypeDescriptor.GetConverter(typeof(T));
    return converter != null && converter.CanConvertFrom(value.GetType()) 
        ? (T) converter.ConvertFrom(value) : default(T);        
}

这适用于字符串作为源,但也支持任何其他源类型。只要有一个类型转换器,它可以转换,它将是。否则,您将获得默认值(即字符串为null,int为0,日期为DateTime.MinValue等)。

相同的代码,作为Object的扩展方法:

namespace System
{
    public static class ObjectExtensions
    {
        public static T ChangeType<T<(this object value) 
        {
            var converter = TypeDescriptor.GetConverter(typeof(T));
            return converter != null && converter.CanConvertFrom(value.GetType()) 
                ? (T) converter.ConvertFrom(value) : default(T);        
        }
    }
}

使用BCL内置类型转换的额外好处是,您可以通过为它们实现类型转换器来支持您想要的任何自定义类型。 MSDN有一个为Point类here实现此功能的示例。

另外,请参阅Scott Hanselman关于此概念的介绍性文章here

答案 1 :(得分:1)

您可以使用与此类似的功能:

    public object Convert(string toConvert, Type typeToConvert)
    {
        if(typeToConvert is string)
        {
            return toConvert;
        }
        else if(typeToConvert is bool)
        {
            bool convertedOutput;
            if (bool.TryParse(toConvert, out convertedOutput))
            {
                return convertedOutput;
            }
        }
        else if (typeToConvert is Int64 || typeToConvert is Int32 || typeToConvert is Int16)
        {
            Int64 convertedOutput;
            if (Int64.TryParse(toConvert, out convertedOutput))
            {
                return convertedOutput;
            }
        }
        // additional converts here...

        return string.Empty;
    }

答案 2 :(得分:1)

泛型可能是满足您要求的方式。有一个代码片段......

    public T read<T>(string whatstring, string returnhow = "string")
    {
        T result = default(T) ;
        // Do Something
        return result;
    }

祝你好运!

答案 3 :(得分:0)

以下是一个示例实现:

public static T GetByType<T> (string input) {
    if(typeof(T) == typeof(string)) { return (T) Convert.ChangeType(input, typeof(T)); }


    if(typeof(T) == typeof(Int32)) { 
        int output;

        if(int.TryParse(input, out output)) { return (T) Convert.ChangeType(output, typeof(T)); }
    }

    if(typeof(T) == typeof(bool)) {
        return (T) Convert.ChangeType(input == "1", typeof(T));
    }

    throw new ArgumentException("Invalid input");
}

工作示例:

void Main()
{
    Console.WriteLine ("Calling with string:");
    object type = GetByType<string>("0");
    Console.WriteLine (type.GetType());

    Console.WriteLine ("Calling with boolean:");
    type = GetByType<bool>("0");
    Console.WriteLine (type.GetType());

    Console.WriteLine ("Calling with integer:");
    type = GetByType<int>("0");
    Console.WriteLine (type.GetType());

    Console.WriteLine ("Calling with DateTime:");
    type = GetByType<DateTime>("0");
    Console.WriteLine (type.GetType());
}

输出:

enter image description here