0

我正在使用第三方 Web 浏览器控件开发 WPF 项目。为了从网页传递数据,我在 JavaScript 中进行重定向,然后取消浏览器的“导航”事件 [请参阅使用 WebKit.NET 从 JavaScript 调用 C# 函数)。

在导航事件中,我正在做一些 URL 处理以从 URL 参数创建参数字典,然后调用特定方法(也基于 URL)。

使用看起来像这样的 URL = 'app-Method?arg1=5.3&arg2=3' 我最终得到一个包含以下信息的字典:

//var methodName = "Method";
//var dictionary = { { "arg1", "5.3" }, { "arg2", "3" } };

在这个阶段我无法进行转换,因为不同的方法会有不同类型的不同参数。

然后我会像这样调用另一个方法(来自 URL 的方法名称):

switch(methodName)
{
     case "Method":
         Method(Convert.ToDecimal(dictionary["arg1"]), Convert.ToInt(dictionary["arg2"]));
         break;
}

显然,在 MVC 中,HTTPGet 操作方法为我完成了所有这些转换、处理和方法调用。我想知道(使用 MVC 库或其他方法)是否可以在非 MVC 应用程序中复制这种行为,如果有很多不同的方法,只是为了更清晰的代码和更简单的目的。

我希望这是有道理的,我发现它有点难以解释。

编辑:

这是完整的示例代码:

this.browser.Navigating += (s, ev) =>
        {
            if (ev.Url.AbsoluteUri.Contains("app"))
            {
                var method = ev.Url.Host.Split('-')[1];
                var arguments = ev.Url.Query.TrimStart('?').Split('&');

                var dictionary = new Dictionary<string, string>();

                foreach (var arg in arguments)
                {
                    var split = arg.Split('=');

                    dictionary.Add(split[0], split[1]);
                }

                switch (method)
                {
                    case "add":
                        Add(Convert.ToInt32(dictionary["first"]), Convert.ToInt32(dictionary["second"]));
                        break;
                    default:                            
                        break;
                }

                ev.Cancel = true;
            }
        };
4

1 回答 1

0

我想出了一个非常灵活的方法来使用反射和 JSON.net 库来做到这一点。我更改了 URL,以便将参数作为 HTML 编码 JSON 传递。我遍历所需的参数并使用 JSON.net 的 ToObject 方法将它们转换为所需的类型。这甚至在传递数组和复杂类型时也有效。

var jsonString = HttpUtility.UrlDecode(ev.Url.Query.TrimStart('?'));

var json = JObject.Parse(jsonString);

var methodInfo = objWithMethodToRun.GetMethod(methodName);

var parameterInfoArray = methodInfo.GetParameters();
var parameters = new object[parameterInfoArray.Length];

//Add parameters as correct types to array.
for (var i = 0; i < parameterInfoArray.Length; i++)
{
    var methodParameterInfo = parameterInfoArray[i];

    //If there is nothing in the json we'll set it to null
    if (json[methodParameterInfo.Name] == null || json[methodParameterInfo.Name].Type == JTokenType.Null)
    {
        parameters[i] = null;
    }
    else
    {
        var convertMethod = json[methodParameterInfo.Name].GetType().GetMethod("ToObject", new Type[] { })
                            .MakeGenericMethod(methodParameterInfo.ParameterType);

        parameters[i] = convertMethod.Invoke(json[methodParameterInfo.Name], null);
    }
}

//Invoke the method
dynamic result = methodInfo.Invoke(objWithMethodToRun, parameters);
于 2012-10-22T14:34:14.983 回答