参数和列表哪个更好

2024-03-13

我当前的代码如下,它是作为代理暴露给客户端的WCF服务方法:

public UnifiedDTO GetAllCardTitle(string trainSymbolOrCarLocation, 
                                  DateTime startDate, 
                                  DateTime endDate, 
                                  string procedureName = CardTitle.procedureNameTrainRuns)

该方法采用过程名称(作为最后一个参数),其余参数是绑定输入参数,但问题是我们在参数数量和类型发生变化的情况下没有灵活性。该项目正处于初始阶段,因此肯定会做出改变。

我所拥有的选项是转换方法,如下所示:

public UnifiedDTO GetAllCardTitle(params object [] parameters)

我们可以自由地传递参数和过程细节,并可以进行相应的绑定。但是,由于装箱和拆箱,可能会出现性能问题。它将要求客户端应用程序传递具有正确顺序和值的参数以进行绑定,正如底层所期望的那样

public UnifiedDTO GetAllCardTitle(List<Filter> parameter, string procedureName)

Where Parameter类将定义为:

public class Filter
{
    public string name { set; get; }
    public string value { set; get; }
    public string dataTypeID { set; get; }

    public Filter(string _name, string _value, string _dataTypeID)
    {
        name = _name;
        value = _value;
        dataTypeID = _dataTypeID;
    }
}

在此方法中,对于给定过程,我们将每个参数与其名称值绑定,DataType,并且它需要将值类型转换为正确的数据类型,它比最后一个方法具有更大的灵活性,并且可以按任何顺序传递,因为绑定是按名称进行的。然而,它需要对申请进行更多的尽职调查。

是否还有更好的方法使用 C#.Net 中引入的新内容来处理这种情况?


None. 使用动态 http://loosexaml.wordpress.com/2011/01/01/wcf-serialization-of-dlr-dynamic-types/对象代替

要创建与 DLR 一起使用的 C# 类,最简单的方法是从 DynamicObject 派生。尝试在 WCF 服务中使用动态类型时会出现一个限制。当尝试使用 WCF 的 DataContractSerializer 进行序列化时,尝试使用 DynamicObject 派生类型将导致运行时异常。

[DataContract]
public class SerializableDynamicObject : IDynamicMetaObjectProvider
{
[DataMember]
private IDictionary<string,object> dynamicProperties = new Dictionary<string,object>();

#region IDynamicMetaObjectProvider implementation
public DynamicMetaObject GetMetaObject (Expression expression)
{
    return new SerializableDynamicMetaObject(expression, 
        BindingRestrictions.GetInstanceRestriction(expression, this), this);
}
#endregion

#region Helper methods for dynamic meta object support
internal object setValue(string name, object value) 
{
    dynamicProperties.Add(name, value);
    return value;
}

internal object getValue(string name) 
{
    object value;
    if(!dynamicProperties.TryGetValue(name, out value)) {
        value = null;
    }
    return value;
}

internal IEnumerable<string> getDynamicMemberNames() 
{
    return dynamicProperties.Keys;
}
#endregion
}


public class SerializableDynamicMetaObject : DynamicMetaObject
{
Type objType;

public SerializableDynamicMetaObject(Expression expression, BindingRestrictions restrictions, object value) 
    : base(expression, restrictions, value) 
{
    objType = value.GetType();
}

public override DynamicMetaObject BindGetMember (GetMemberBinder binder)
{
    var self = this.Expression;
    var dynObj = (SerializableDynamicObject)this.Value;
    var keyExpr = Expression.Constant(binder.Name);
    var getMethod = objType.GetMethod("getValue", BindingFlags.NonPublic | BindingFlags.Instance);
    var target = Expression.Call(Expression.Convert(self, objType),
                                 getMethod,
                                 keyExpr);
    return new DynamicMetaObject(target,
        BindingRestrictions.GetTypeRestriction(self, objType));
}

public override DynamicMetaObject BindSetMember (SetMemberBinder binder, DynamicMetaObject value)
{
    var self = this.Expression;
    var keyExpr = Expression.Constant(binder.Name); 
    var valueExpr = Expression.Convert(value.Expression, typeof(object));
    var setMethod = objType.GetMethod("setValue", BindingFlags.NonPublic | BindingFlags.Instance);
    var target = Expression.Call(Expression.Convert(self, objType),
    setMethod, 
    keyExpr, 
    valueExpr);
    return new DynamicMetaObject(target,
        BindingRestrictions.GetTypeRestriction(self, objType));
}

public override IEnumerable<string> GetDynamicMemberNames ()
{
    var dynObj = (SerializableDynamicObject)this.Value;
    return dynObj.getDynamicMemberNames();
}
}

一个警告,动态成员可以是任何东西,这意味着在运行时有人可以将方法分配给这些字段之一。如果这在您的应用程序中可行,您需要确保分配给动态类型的任何方法都不会被序列化。我把这个作为练习留给读者。

取自这里 http://loosexaml.wordpress.com/2011/01/01/wcf-serialization-of-dlr-dynamic-types/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

参数和列表哪个更好 的相关文章

随机推荐

  • Google 未显示 React-Helmet 标题和描述

    我使用react helmet 为我的React 应用程序的每个页面提供唯一的标题和描述 当我使用开发工具检查页面时 标题在浏览器选项卡中正确呈现 标题和描述也正确呈现 然而 谷歌并没有在搜索结果中显示标题或描述 我究竟做错了什么 我研究过
  • 根据 selectInput 更改绘图图表 y 变量

    我正在创建一个简单的折线图 可以在 Shiny 中正确呈现 我现在添加了一个 selectInput 其中包含 2 个不同度量的名称 按照它们在我的数据集中出现的方式编写 我希望我的 y 变量能够相应地改变 p lt plot ly dat
  • 在一个查询中插入两个表

    如何同时将值插入到两个表中 如果不成功 两个表都应该回滚 我正在使用 SQL Server 查询过程会抛出 C 代码 您可以将这两个查询作为一个语句运行 insert into table1 values insert into table
  • 在Android项目中使用开源库

    我是 Android 编程的初学者 我正在使用 android studio 现在我想知道从 gitHub 安装开源库的最佳方法是什么 我的问题是从组织原则的角度来看 我应该为每个库创建一个新包并将所有库源代码按原样放入该包中吗 该包应该位
  • 导入类型时 Sveltekit Typescript 解析错误

    我在一个全新的 Sveltekit 项目中有这个非常简单的组件
  • Spring data mongodb 使用 MongoTemplate 从文档中删除属性

    我有一个如下所示的文档 id ObjectId 5864ddd8e38112fd70b89893 class com apic models UserReg name xxx email email protected cdn cgi l
  • REQUEST_URI 与显式路径和文件名不匹配

    真的很困惑 因为形式和语法看起来都很好 REQUEST URI 的 RewriteCond 与显式路径和文件名不匹配 隔离时 REQUEST FILENAME 的 RewriteCond 匹配得很好 我已经使用 phpinfo 验证了 RE
  • 尽管同时实现了 hashCode() 和 equals(),HashSet 仍添加了重复条目

    我有以下课程 class Point double x y constructor and other functions here public boolean equals Point p if p null return false
  • Node.js 存档器需要通过 glob 排除文件类型的语法

    使用 archiver js 适用于 Node js 我需要从递归 多子目录 存档中排除图像 这是我的代码 const zip archiver zip zlib level 9 const output await fs createWr
  • Python 脚本 - 连接到 SSH 并运行命令

    我已经知道有 Python 的 ssh 模块 但这不是我正在寻找的 我想要的是一个 python 脚本来执行以下操作 gt 连接到 用户输入 SSH 主机 gt 使用凭据 由用户提供 连接 gt 在 SSH 主机上运行命令 telnet 到
  • 使用 ST25 android SDK 进行 NFC 标签密码保护

    我正在与ST25 标签 更具体地说是 type5 标签 ST25DV64K 适用于 Android 的 ST25 SDK 有一些有趣的示例和教程 我仍然在努力使用文档末尾提供的代码示例here https www st com resour
  • MySQL - 如何使用 LIKE 搜索精确的单词匹配?

    我使用此查询来选择数据 mysql query SELECT FROM products WHERE product name LIKE search 唯一的问题是 它有时会选择比我想要的更多的东西 例如 我想选择产品 BLA 但我的查询也
  • Internet Explorer 11 与 Asp.Net 4.0 的会话问题

    我遇到一个奇怪的问题 我在 asp net 4 0 中开发了一个网站 它在所有浏览器上都能正常工作 因为我也在处理会话 因此用户必须登录才能使用该网站 在 Internet Explorer 11 上 当您访问网站 url 时 它会在 ur
  • 快速for循环与睡眠

    我有一个 Swift 4 ios 应用程序 按下按钮时会显示随机消息和照片 这工作正常 但我想创建一个无限循环来在按下按钮时显示随机消息 照片 我尝试了多种方法来实现这一目标 但没有一个有效 在主线程完成之前 标签和图像视图似乎不会更新 下
  • 让 ScrollView 与自动布局和情节提要一起使用

    我正在尝试为我想要构建的应用程序制作一个非常简单的布局 但我似乎正在努力使用 ScrollView 并通过 Storyboard 让它工作 基本上我正在尝试构建以下内容 我已经使用几个教程完成了约束 但它要么不滚动 要么看起来错误 有什么建
  • 与 React 内联自定义 `::-webkit-scrollbar`

    我怎样才能申请 webkit scrollbar在 React 中使用内联样式将伪元素添加到组件 你不能写pseudo内联选择器 需要在css中添加 参考这个link https developer mozilla org en US do
  • 关闭时 SqlDependency 订阅不会从 dm_qn_subscriptions 中删除

    My SQL依赖关系工作正常 当应用程序退出时 代理队列和服务会正确删除 我确实执行SqlDependency Stop 按照终止进程之前的建议 但我注意到由SQL依赖关系应用程序关闭后 仍保留在表 sys dm qn subscripti
  • watir-webdriver 黑色屏幕截图

    我正在使用 watir webdriver 浏览我的网站并在不同的浏览器中抓取屏幕截图 有时 在 IE 中截取的屏幕截图尺寸正确 但颜色全黑 同时运行的 Firefox 测试看起来不错 browser driver save screens
  • Javascript window.open 不工作

    好的 我正在尝试登录推特 这段代码中没有打开窗口 收到警报的响应不为空 并且是指向登录屏幕的链接 有任何想法吗 var url twitter login php var con createPHPRequest con open POST
  • 参数和列表哪个更好

    我当前的代码如下 它是作为代理暴露给客户端的WCF服务方法 public UnifiedDTO GetAllCardTitle string trainSymbolOrCarLocation DateTime startDate DateT