C# 是否使用匿名或动态类型作为参数? 公共异步任务GetAllAsync(日期时间从, 字符串orderBy=“-published”, DateTime to=新的DateTime(), int page=1 int category=0, int[]标记=null, 每页整数=10)

C# 是否使用匿名或动态类型作为参数? 公共异步任务GetAllAsync(日期时间从, 字符串orderBy=“-published”, DateTime to=新的DateTime(), int page=1 int category=0, int[]标记=null, 每页整数=10),c#,wpf,xamarin,C#,Wpf,Xamarin,例如,在http服务中获取新闻 在几乎所有的服务中都有很多查询参数 我必须为每个类创建单独的类吗 您的问题被标记为xamarin相关,因此我将从这个角度进行说明: 如果您打算以Xamarin.iOS为目标,则不能使用c#动态功能。当您使用dynamic关键字时,这会触发c#编译器在幕后生成一些隐藏的代码(您可以通过使用IL反汇编程序查看来验证我所说的内容),并且该代码使用了来自DLR的构造,称为CallSite。这些调用站点对象反过来在内部使用DynamicMethod,以处理强类型动态引用的魔

例如,在http服务中获取新闻

在几乎所有的服务中都有很多查询参数


我必须为每个类创建单独的类吗

您的问题被标记为
xamarin
相关,因此我将从这个角度进行说明:

如果您打算以Xamarin.iOS为目标,则不能使用c#
动态
功能。当您使用
dynamic
关键字时,这会触发c#编译器在幕后生成一些隐藏的代码(您可以通过使用IL反汇编程序查看来验证我所说的内容),并且该代码使用了来自DLR的构造,称为
CallSite
。这些调用站点对象反过来在内部使用
DynamicMethod
,以处理强类型
动态
引用的魔力。而
DynamicMethod
是在运行时生成可运行代码的优化机制

iOS不允许在运行时生成可运行代码

因此,您的应用程序将在iOS模拟器上运行(没有此限制),但在真实设备上会失败

我有几篇(旧的)关于该功能内部工作原理的博客文章,这应该表明,鉴于苹果对代码发出的限制,你不能在iOS平台上使用它:

您也不能为此使用匿名对象,因为匿名类型定义不能导出到函数范围之外。换句话说,它们不能出现在方法签名中


恐怕您唯一可行的选择是对函数进行大量重载,或者定义一个健壮的选项类(或类的层次结构),该类可以处理您需要的所有变体。

否,但要更好地描述问题。问题是,我应该为多个参数的传输创建一个单独的类,还是更适合这个匿名对象?在这个上下文中,“匿名对象”或“动态类型”是什么意思?``公共异步任务GetAllAsync(dynamic params)``这主要是基于观点的。在本例中,我将为查询参数创建类,并为每个查询参数提供一个生成器类。这使得它可以配置。
public async Task<List<News>> GetAllAsync(DateTime from, 
                                          string orderBy = "-published", 
                                          DateTime to = new DateTime(),
                                          int page = 1
                                          int category = 0,
                                          int[] tags = null, 
                                          int perPage = 10)