我正在使用Expression创建一些动态生成的代码.我的解决方案有效,除了一个功能:我想做一个检查类型转换,如果转换失败,则抛出TypeCastException.
我找到了Expression.TypeAs(),它执行类型转换,但是当转换失败时它返回null而不是throw.
有一种简单的方法可以在Expression中进行检查类型转换吗?或者我是否必须检查null并自己抛出异常?
这就是我所拥有的: -
ParameterExpression typedAttribute = Expression.Variable(attributeType, "typedAttribute");
ParameterExpression typedValue = Expression.Variable(valueType, "typedValue");
BlockExpression methodBlock = Expression.Block(new[] { typedAttribute, typedValue }, new Expression[]
{
Expression.Assign(typedAttribute, Expression.TypeAs(attribute, attributeType)),
Expression.Assign(typedValue, Expression.TypeAs(value, valueType)),
Expression.Call(visitor, methodInfo, typedAttribute, typedValue),
Expression.Assign(visited, Expression.Constant(true)),
});
Run Code Online (Sandbox Code Playgroud) 我们有一个已建立的WCF SOAP服务.它的接口在WSDL中定义,从中为我们的服务器生成C#类(客户使用相同的WSDL以各种语言生成客户端绑定).WSDL有一个当前版本,我们可以改变一点,旧版本,我们不能更改或删除没有弃用期,咨询等.SOAP请求往往很复杂,在同一请求中有多个XML命名空间.
WCF SOAP服务中有很多"智能",它提供了我们需要制作的新Web应用程序所需的各种提取和报告工具.我们希望将AngularJS用于客户端.但是这些复杂的SOAP请求在JavaScript世界中并不容易.如果我们只有REST服务,我们可以使用角度资源服务.如果不是这样,那么一个讲JSON的服务器,虽然是像SOAP这样的RPC样式,但运行时间相当接近.
关于如何减轻我们的服务器和客户端之间的阻抗不匹配,我有各种各样的想法.但没有什么听起来快速或容易.
我想到了: -
我正在寻找建议.
我最近改变了
this.FieldValues = new object[2, fieldValues.GetUpperBound(1) + 1];
for (int i = 0; i < FieldCount; i++)
{
this.FieldValues[Current, i] = fieldValues[Current, i];
this.FieldValues[Original, i] = fieldValues[Original, i];
}
Run Code Online (Sandbox Code Playgroud)
至
FieldValues = new object[2, fieldValues.GetLength(1)];
Array.Copy(fieldValues, FieldValues, FieldValues.Length);
Run Code Online (Sandbox Code Playgroud)
其中Current和Original的值分别为常数0和1.FieldValues是一个字段,fieldValues是一个参数.
在我使用它的地方,我发现Array.Copy()版本更快.但另一位开发人员表示,他在一个独立的程序中对Array.Copy()进行for循环计时,并发现for循环更快.
Array.Copy()可能不是真的更快吗?我认为它应该是超级优化的!
我正在使用JavaScript,HTML5和AngularJS编写应用程序.它只需要在最近的浏览器上工作(例如,IE10但不是IE9).
在应用程序的几个地方,将会有计算密集型任务,例如XML解析,base64解码; 这些可能涉及相当大的数据(几MB肯定是可能的).
如果我只是打电话之类的东西atob()或者DOMParser.parseFromString(),我会得到秒钟甚至几分钟无响应的浏览器.这显然是用户不能接受的.
我使用Angular的Q服务来实现异步访问外部Web服务,从而避免在等待响应时挂起浏览器.但是这样的操作已经有了异步API.
那些没有自己的异步API的计算关注任务怎么样?
我可以将这些任务中的一些分开,链接承诺.这有帮助吗?浏览器消息队列在每个任务结束时是否会自动旋转?
我看到"Web Workers"的存在,似乎提供了适当的多线程.但是它们似乎具有相当差的能力来向/从工作线程传输对象.当然,像我这样的人来自C#.Net似乎也是这样!例如,我想将Angular服务(内置和我自己的)注入到线程上的任务中.而且我也不想在线程之间复制大量数据.
其他人是否实现了包含严重计算的响应式客户端Web应用程序?如果是这样,他们用什么来实现这一目标?
我需要使用JavaScript创建一些XML.其中一个更困难的事情是我需要使用XML限定名称填充节点的文本内容.也就是说,本地名称和前缀,例如myns:myelement.
困难在于XML文档不包含前缀应绑定到的命名空间的任何其他元素或属性.所以我需要在封闭元素中添加一个名称空间节点(xmlns)来定义前缀.例如: -
<myElement xmlns:myprefix="http://something">myprefix:foo</myElement>
Run Code Online (Sandbox Code Playgroud)
我看不到在JavaScript中添加xmlns命名空间节点的好方法.目前,我有以下可怕的黑客: -
// Hacky way to get a namespace prefix definition. TODO: can we do something nicer?
var prefix = "ixe";
requestElement.setAttributeNS(inputTypes[0].namespaceURL, prefix + ":" + "def", "");
inputElement.textContent = prefix + ":" + inputTypes[0].localName;
Run Code Online (Sandbox Code Playgroud)
我正在使用所需的命名空间和任意前缀创建一个不需要的属性.这会导致生成的文档具有xmlns命名空间节点,以定义命名空间的前缀.
在最新的FireFox和Chrome上,但不是在IE上,可以做到inputElement.setAttribute("xmlns:" + PREFIX, inputType.namespaceUri);.但我想要一个与浏览器无关的解决方案.
但我宁愿不创建虚拟属性.当然,必须可以显式创建命名空间节点.我错过了什么?