ExpandoObject的使用

本文介绍了 ExpandoObject 在不需要创建类或结构体时的应用场景,例如在发送邮件时动态填充参数。同时也讨论了使用 ExpandoObject 时需要注意的问题,包括其适用范围、对象复杂度及代码维护难度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一,ExpandoObject使用场合
 
在传递对象,但是又不想创建一个class或者struct的时候,ExpandoObject就是一个非常好的选择。
假如我们有一个SendMail的函数,功能是发送一个通知邮件给客户,邮件的文本模板,如下:
Dear [Name],
We have sent the gift to your address: [Address]
 
在具体发送邮件的时候, [Name]和[Address]的内容是从函数GetMailParameters()动态读取出来的。
那么函数GetMailParameters的返回值如何定义好呢?
 
如果为GetMailParameters()函数创建一个struct或者class来传递, 有些小题大做了,而且定义的structclass重用性会非常低。
 
如果使用了ExpandoObject, 就非常容易的解决了这个问题。

public dynamic GetMailParameters()
{
     var mailParameters = new ExpandoObject();
     mailParameters.Name=”Peter”;
     mailParameters.Address=”Shanghai China”
     return mail;
}
 
就算以后邮件模板改变,添加了新的变量,也只是简单的在ExpandoObject上扩展一个属性就可以了。
二, 注意问题
 
由于ExpandObject的先天不足(无特征性):
 
1. 没有区分的类型名称
2. 没有确切类型定义
 
如果你看到一个string的函数返回值, 你会想到什么, 你会知道它是一个字符串(这不是废话吗?), 有Length等属性,有IndexOf等方法。
当返回值是MailHelper类对象时,你想只需要直接F12就能看到源码,里面有关于这个类的详细定义,接着你就知道如何使用这个对象了。
 
当你从一个函数中得到一个ExpandObject的dynamic的返回值时,你知道是什么吗? ExpandObject就是一个黑箱,里面装着什么,谁都不知道。
所以,
 
1. ExpandObject不能用于太复杂的对象。
 
ExpandObject最好还是作为简单的数据容器,不要弄得过于复杂,甚至包含有函数处理。
 
2.ExpandObject的使用范围必须要短
 
范围短的意思是,产生和使用ExpandObject的代码的路径必须要短(主要是函数调用路径)。如果你正在使用一个ExpandObject对象,查看产生这个ExpandObject的地方,发现分散在好几个函数之中,还有嵌套的话,那么这个ExpandObject是非常难于维护的。
 
3. ExpandObject的使用场合最好贴近程序的终端。
 
比如在MVC中的ViewBag, 就是一个好的例子。ViawBag用于生成页面, 而页面就是MVC程序的终端了。到了终端,ExpandObject也就不能祸害它人了。
正是由于ExpandObject的无特征性,什么都可以做,所以容易导致滥用。
PowerShell中的`System.Dynamic.ExpandoObject`是一个动态对象,它允许在运行时动态地添加、删除和修改属性和方法。`ExpandoObject`实现了`IDictionary<string, object>`接口,因此可以通过字典的方式来访问其属性。 以下是一些关于`System.Dynamic.ExpandoObject`的关键点: 1. **动态属性添加**: 你可以在运行时向`ExpandoObject`添加新的属性,而不需要事先定义它们。 ```powershell $expando = New-Object System.Dynamic.ExpandoObject $expando | Add-Member -MemberType NoteProperty -Name Name -Value "John" $expando | Add-Member -MemberType NoteProperty -Name Age -Value 30 Write-Output $expando.Name # 输出: John Write-Output $expando.Age # 输出: 30 ``` 2. **动态方法添加**: 你也可以在运行时向`ExpandoObject`添加新的方法。 ```powershell $expando = New-Object System.Dynamic.ExpandoObject $expando | Add-Member -MemberType ScriptMethod -Name SayHello -Value { Write-Output "Hello, $this.Name!" } $expando.Name = "John" $expando.SayHello() # 输出: Hello, John! ``` 3. **作为字典使用**: 由于`ExpandoObject`实现了`IDictionary<string, object>`接口,你可以通过字典的方式来访问其属性。 ```powershell $expando = New-Object System.Dynamic.ExpandoObject $dict = [IDictionary[string, object]]$expando $dict["Name"] = "John" $dict["Age"] = 30 Write-Output $dict["Name"] # 输出: John Write-Output $dict["Age"] # 输出: 30 ``` `System.Dynamic.ExpandoObject`在需要动态对象操作的场景中非常有用,特别是当对象的结构在编译时未知或在运行时需要动态变化时。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值