问题标签 [expandoobject]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
799 浏览

c# - 在 expando 对象上定义计算属性

我正在使用 expando 对象,并且正在尝试定义计算属性。

我知道我可以通过执行以下操作来定义一个简单的属性:

同样,我也可以定义一个方法:

使用标准对象时,我们可以定义计算属性,即定义将返回自定义方法/计算结果的属性。不需要举例。

我需要在我的 expando 上做类似的事情——拥有一个实际上调用“Func”的属性(或其他形式的委托,只要我可以调用自定义方法并具有自定义返回类型,任何事情都会发生)。所以基本上我需要调用第二个示例中的方法,但让它像属性一样工作。

基本上我需要能够使用myExpando.GetTheQuestion而不是myExpando.GetTheQuestion()来调用它,同时保持将自定义委托定义为属性主体的能力。

有没有办法做到这一点?我相信我可以通过使用表达式树来做到这一点,但我承认我有点迷路了。任何人都可以就如何实现这一目标提供一些指导吗?


编辑

做了更多的研究。除非有一些我不知道的非常具体的类/接口/sintax,否则我开始认为上述是不可能的。据我所知,ExpandoObject 类通过定义一些执行后台管道的方法来工作 - TryGetMember、TrySetMember 等。现在,当在动态 objetc 上“访问属性”时,TryGetMember 是被调用的成员。该成员从某种内部字典返回一个值(是的,我知道......这有点简化,但应该给出这个想法)......没有对返回的值类型进行测试。这意味着在我的示例中myExpando.GetTheQuestion将返回原始 Func。

似乎由于 TryGetMember 只是返回一个值,因此没有办法让它“执行”属性代码。为了实现这一点,您需要某种表达式/lambda/func/action 代理项,其值实际上是方法的结果。这似乎是不可能的(除非我错过了什么,否则也没有多大意义——基本上你会有一个设置为“委托”的值,然后作为委托返回值获取???)。我是正确的还是这个或者我错过了什么?

0 投票
1 回答
558 浏览

c# - 如何在 C# 中递归遍历和记录 HttpRequestMessage 的属性?

感谢您的关注!

背景

我正在开发一个 MVC4 .NET 应用程序,并编写了一个过滤器来捕获所有错误(应用程序范围内),记录所述错误,然后通过 HTML 格式的电子邮件将它们报告给开发团队。

我编写的过滤器获取 HttpActionExecutedContext 并从那里我可以导出异常、堆栈跟踪、调用的方法以及一堆其他有用的信息。

我访问的大部分信息都是字符串或 IDictionary 的形式,我使用辅助方法来迭代这些项目并将它们放入用于报告电子邮件的 HTML 表中。

然而,有一个属性让我很伤心:HttpRequestMessage 属性。

HttpActionExecutedContext 对象(HttpActionExecutedContext.Request.Properties)的这个属性有很多不同类型的嵌套属性。

问题

我遇到了几个障碍,以递归方式遍历此 HttpActionExecutedContext.Request.Properties 对象并将其解析为 KV 对的层次结构。问题是由于空值、类型不匹配等造成的。

这是我从 Request.Properties 获得的当前结果:

MS_HttpContext:
System.Web.HttpContextWrapper

MS_RetrieveClientCertificateDelegate:System.Func`2[System.Net.Http.HttpRequestMessage,System.Security.Cryptography.X509Certificates.X509Certificate2]

MS_IsLocal:
未创建值。

MS_IncludeErrorDetail:
未创建值。MS_HttpRouteData:System.Web.Http.WebHost.Routing.HostedHttpRouteData

MS_SynchronizationContext:
System.Web.AspNetSynchronizationContext

MS_HttpConfiguration:System.Web.Http.HttpConfiguration

MS_DependencyScope:
System.Web.Http.Dependencies.EmptyResolver

MS_DisposableRequestResources:>System.Collections.Generic.List`1[System.IDisposable]

所以你可以看到,就价值而言,我真正得到的只是type财产的价值。我需要value. 如果该值是嵌套字典或其他东西,那很好,但我需要遍历它并记录它的 KV 对,因为只给我对象的类型是没有用的。

问题

我如何递归地遍历这个对象并最终得到一个 KV 对的字典(其中一些值本身就是字典)?是否有我缺少的辅助类或某种动态方法?

0 投票
1 回答
388 浏览

code-analysis - ExpandoObject 导致违反规则 CA1502:避免过于复杂

我有执行邮件合并类型操作的代码,并且我正在使用动态/ExpandoObject 来组装属性。我这样做而不是构建一个匿名类,因为在邮件合并发生之前,不同的方法会添加属性。代码运行良好。

问题是 Visual Studio 代码分析将 ExpandoObject 上的每个属性集操作评分为 1 点圈复杂度。所以一个简单的线性方法设置一堆没有分支逻辑的属性是得到分数> 25,这是违反此规则的值。

这是我的代码问题,还是代码分析工作方式的问题?

我的代码如下所示:

0 投票
1 回答
2453 浏览

winforms - 将 ExpandoObject 实例的自定义属性值绑定到 .NET Windows 窗体控件

上下文:Visual Studo 2012/C# 5.0

我有一个带有三个文本框控件的 .NET Windows 窗体:firstNameTextBoxlastNameTextBoxageTextBox,以及一个简单的自定义类

我想将客户自定义类的实例的属性绑定到我的 Windows 窗体控件。所以我写:

这很好用。然后我通过使用匿名类型稍微更改代码:

}

这也很有效,尽管在这种情况下我只有单向绑定。然后我进一步更改我的代码:

我收到运行时错误:

'无法绑定到 DataSource 上的属性或列 FirstName。参数名称:dataMember'

问题:如何将具有一组动态自定义属性的 System.Dynamic.ExpandoObject(或 System.Dynamic.DynamicObject)实例绑定到 Windows 窗体(文本框)控件集?

注 1:具有聚合/容器辅助类的解决方案对我来说是可以的。

注意 2:我花了几个小时在谷歌上搜索并尝试应用不同的技术(包括我在 StackOverflow 上找到的技术),但我失败了。

这是基于 Hans Passant 提示的“优雅”解决方案:

0 投票
1 回答
25478 浏览

c# - 使用 JSON.NET 将属性反序列化为 ExpandoObject

例如,有一个像下一个这样的对象:

它是这样使用的:

如果我反序列化通过序列化上述实例获得的 JSON 字符串Data,即使我提供了属性,ExpandoObjectConverter它也不会反序列化为ExpandoObject

如何反序列化分配有匿名对象的类属性,或者至少不将具体类型作为ExpandoObject?

编辑:

有人回答说我可以只使用动态对象。这对我不起作用。我知道我可以这样做,但事实并非如此,因为我需要一个 ExpandoObject。谢谢。

编辑2:

其他一些用户回答我可以将 JSON 字符串反序列化为ExpandoObject. 这不是这个问题的目标。我需要反序列化具有动态属性的具体类型。在 JSON 字符串中,此属性可以是关联数组。

0 投票
1 回答
618 浏览

vb.net - ExpandoObject 在 vb.net 和 c# 中的工作方式不同

在从这里https://github.com/facebook-csharp-sdk/facebook-winforms-sample转换一些代码之后,isnt acseptig 代码就像parameters.client_id

这是我遇到问题的部分

0 投票
3 回答
31424 浏览

c# - 使用 LINQ,是否可以从 Select 语句中输出动态对象?如果是这样,怎么做?

目前在 LINQ 中,以下编译和工作正常:

但是,过去几个版本的 .NET/C# 扩展了动态对象的作用,例如,ExpandoObject我想知道是否有办法基本上做到这一点:

显然,我已经尝试过上面的代码但没有成功,但似乎我遗漏了一些东西。

0 投票
1 回答
242 浏览

.net - 如何使用 ExpandoObject 重载方法?

我有以下 expando 对象

我定义CalcAge了计算年龄的方法..我想添加具有如下参数的重载方法

我该如何实现它ExpandoObject,我可以在其中执行以下操作?

0 投票
0 回答
89 浏览

c# - C#中使用动态类型、动态对象和expando对象的模式/问题

在对 C# 中的 Dynamic Objects 和 Expando Objects 进行了一些研究之后,我最近意识到了 dynamic 关键字

我可以理解它非常酷,但是除了 ASP.NET MVC 中的 ViewBag 之外,我正在努力寻找要使用的应用程序。

所以我正在寻找任何可以使用 Dynamic 和 Expando 对象的设计模式或可以使用动态对象优雅地解决的问题示例......

0 投票
2 回答
12399 浏览

.net - 'System.Collections.Generic.IList' does not contain a definition for 'Add' when using 'dynamic' and 'ExpandoObject'

Say that I have a class, Foo, looking something like this:

public class Foo : IFoo
{
    public F

Say that I have a class, Foo, looking something like this:

The interface IFoo looks like:

Now, when I do the following:

What am I doing wrong here?????


I'm not sure if this subverts your particular use case, but:

Try explicitly casting Bars to System.Collections.IList.

Source: https://stackoverflow.com/a/9468123/364

Alternatively, just redefine Bars as IList rather than IList<dynamic> in your interface + class.