我用JavaScript创建了一个new object(),将一些值放入其中,然后将其传递给PageMethod ...

var filters = new object();

filters.Name = $("#tbxName").val();
filters.Age = parseInt($("#tbxAge").val());

PageMethods.getPeople(filters, getPeopleCallback);

...以其签名接收dynamic参数。
[WebMethod]
public static object getPeople(dynamic filters)
{
    ...

除了服务器端PageMethod可以将dynamic参数理解为Dictionary之外,整个代码都可以编译并正常运行。

当我调试代码以查看filters对象的定义时,它向我显示以下类型:filters = {System.Collections.Generic.Dictionary<string,object>}
因此,处理它的唯一方法是将其用作Dictionary ...
var name = filters["Name"];
var age = filters["Age"] as int?;

..但我的意图是将其用作动态对象
var name = filters.Name;
var age = filters.Age;

我知道这根本没什么大不了,对我来说作为Dictionary来访问它绝对没有问题(而且我也知道我可以使DynamicObject“Proxy”像动态对象一样访问Dictionary)。

我只想了解这一点。所以:
  • 为什么PageMethod将其理解为字典?
  • 是否有办法使它作为动态对象工作(“代理”方法除外)?

  • 我希望这能行得通,因为我通常在服务器端定义那些Filter类,并按照相同的结构在Javascript中创建它,而当我将Type定义为参数时,PageMethod可以理解并正确转换它(例如:getPeople(Filters filters))。因此,我想知道它是否还能对动态对象做到这一点(为我节省时间和不必要的类)。

    感谢您的宝贵时间和帮助。

    最佳答案

  • 页面方法将其视为“字典”的原因是因为JavaScriptSerializer在内部如何工作。由于所有JSON对象都可以表示为Dictionary<string, object>,因此JSS的第一步是将JSON字符串转换为Dictionary(如果未注册目标类型的自定义转换器),然后最终将该Dictionary作为转换的最终结果动态。
  • 不容易。

  • 您可以尝试为dynamic编写自己的JavaScriptConverter。这是我刚才写过的同一场比赛的一个例子:https://gist.github.com/6cfcdfdf2a117fa5e81b

    我的是自定义序列化行为而不是反序列化,但是您可以在Deserialize方法中实现自己的代码。

    07-24 09:45
    查看更多