1

我正在尝试构建一个动态 Web API,它使用以下方法调用现有方法

GetMethod(String methodName, Type[] Types)

System.Reflection. 由于多态性,天真的方法GetMethod(String methodName)在调用具有相同名称的方法时使用失败。

这是我的动态 Web API 主方法标头的样子:

public Object API_GET(HttpRequestMessage request)

我读了request这样的内容:

    var content = request.Content;
    string contentString = content.ReadAsStringAsync().Result;

字符串contentString现在的结构如下:

"command='aCommand'&param1=1&param2='nnn'" // example

现在我想知道如何GetMethod(methodName, Types)根据从上面的字符串中提取的参数来调用适当的现有方法

C# 中有没有办法将字符串转换为最合适的数据类型?

例如

"2"    => Int
"2.0"  => Double
"true" => Bool
"nnn"  => String
4

2 回答 2

0

使用动态类型,它会自动转换你的类型。例如

    dynamic v1 = 0;
    v1 = 5;
于 2013-11-11T08:19:41.983 回答
0

没有自动的方法来做你想做的事,但是编写一系列解析器来尝试你的组合并返回第一个成功的组合并不难。唯一的缺点是因为您无法提前知道哪个解析器成功了返回的类型object,但是您可以使用is运算符测试结果以找出它是哪种类型。

public static class GenericParser
{
    //create a delegate which our parsers will use 
    private delegate bool Parser(string source, out object result);

    //This is the list of our parsers
    private static readonly List<Parser> Parsers = new List<Parser>
    {
        new Parser(ParseInt),
        new Parser(ParseDouble),
        new Parser(ParseBool),
        new Parser(ParseString)
    };

    public static object Parse(string source)
    {
        object result;
        foreach (Parser parser in Parsers)
        {
            //return the result if the parser succeeded.
            if (parser(source, out result))
                return result;
        }

        //return null if all of the parsers failed (should never happen because the string->string parser can't fail.)
        return null;
    }

    private static bool ParseInt(string source, out object result)
    {
        int tmp;
        bool success = int.TryParse(source, out tmp);
        result = tmp;
        return success;
    }

    private static bool ParseDouble(string source, out object result)
    {
        double tmp;
        bool success = double.TryParse(source, out tmp);
        result = tmp;
        return success;
    }

    private static bool ParseBool(string source, out object result)
    {
        bool tmp;
        bool success = bool.TryParse(source, out tmp);
        result = tmp;
        return success;
    }

    private static bool ParseString(string source, out object result)
    {
        result = source;
        return true;
    }
}

这是一个测试程序

public class Program
{
    static void Main(string[] args)
    {
        TestString("2");
        TestString("2.0");
        TestString("true");
        TestString("nnn");
    }

    static void TestString(string testString)
    {
        object result = GenericParser.Parse(testString);
        Console.WriteLine("\"{0}\"\t => {1}", testString, result.GetType().Name);
    }
}

它的输出:

"2"      => Int32
"2.0"    => Double
"true"   => Boolean
"nnn"    => String
于 2013-11-11T07:52:54.397 回答