ExpandoObject的使用

本文介绍了如何在C#中利用ExpandoObject作为临时数据结构,避免创建复杂类,以及其在简化邮件参数传递中的应用。然而,由于其无类型限制和缺乏明确标识,需注意其适用于简单数据容器,范围短且在终端使用为佳,以防止滥用。
摘要由CSDN通过智能技术生成

总结:在不需要创建类而需要使用类结构的时候使用

一,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 mailParamaters;
}

就算以后邮件模板改变,添加了新的变量,也只是简单的在ExpandoObject上扩展一个属性就可以了。

二, 注意问题

由于ExpandObject的先天不足(无特征性):

  1. 没有区分的类型名称
  2. 没有确切类型定义

如果你看到一个string的函数返回值, 你会想到什么, 你会知道它是一个字符串(这不是废话吗?), 有Length等属性,有IndexOf等方法。
当返回值是MailHelper类对象时,你想只需要直接F12就能看到源码,里面有关于这个类的详细定义,接着你就知道如何使用这个对象了。

当你从一个函数中得到一个ExpandObjectdynamic的返回值时,你知道是什么吗? ExpandObject就是一个黑箱,里面装着什么,谁都不知道。
所以,

  1. ExpandObject不能用于太复杂的对象。

ExpandObject最好还是作为简单的数据容器,不要弄得过于复杂,甚至包含有函数处理。

  1. ExpandObject的使用范围必须要短

范围短的意思是,产生和使用ExpandObject的代码的路径必须要短(主要是函数调用路径)。如果你正在使用一个ExpandObject对象,查看产生这个ExpandObject的地方,发现分散在好几个函数之中,还有嵌套的话,那么这个ExpandObject是非常难于维护的。

  1. ExpandObject的使用场合最好贴近程序的终端。

比如在MVC中的ViewBag, 就是一个好的例子。ViawBag用于生成页面, 而页面就是MVC程序的终端了。到了终端,ExpandObject也就不能祸害它人了。
正是由于ExpandObject的无特征性,什么都可以做,所以容易导致滥用。


深入理解 c# 第十四章 用ExpandoObject存储和获取值

class SimpleExpando
    {
        static void Main()//用ExpandoObject 存储和获取值
        {
            dynamic expando = new ExpandoObject();
			//{System.Dynamic.ExpandoObject}
            IDictionary<string, object> dictionary = expando;
			//{System.Dynamic.ExpandoObject}
            expando.First = "value set dynamically";
            Console.WriteLine(dictionary["First"]);
 
            dictionary["Second"] = "value set with dictionary";
            Console.WriteLine(expando.Second);
        }
    }

使用ExpandoObject

System.Dynamic.ExpandoObject看上去像个古怪的野兽。它只有一个无参的公共构造函数。除了各个接口的显式实现外,它没有公共方法。比较重要的接口为IDynamicMetaObjectProviderIDictionary<string,object>。(它实现的其他接口均为IDictionary<string,object)所扩展的接口。) 它是封闭的,所以不能继承它从而实现有用的行为。只有用dynamic引用或实现某个接口时,才能使用ExpandoObject设置或获取单独的属性实现字典接口暗示了它的用途–通过名称存储对象。而这些名称也可以用作动态类型的属性。

将字符串作为字典的值。

输出

value set dynamically
value set with dictionary 

动态属性ExpandoObject

1、动态创建对象及其属性ExpandoObject

查看ExpandoObject的定义:
在这里插入图片描述
不难发现其实质是一个Dictionary存放键值对,那么能否通过Dictionary实现动态属性生成咧??

2、动态属性ExpandoObject

在这里插入图片描述

好的,下面是一个简单的 C# 程序,可以将 Excel 文件转换为多种格式,如 CSV、XML 和 JSON 等。程序使用了 Microsoft.Office.Interop.Excel 库来读取 Excel 文件,使用 Newtonsoft.Json 库来序列化为 JSON 格式。 ```csharp using System; using System.IO; using System.Linq; using Microsoft.Office.Interop.Excel; using Newtonsoft.Json; namespace ExcelConverter { class Program { static void Main(string[] args) { if (args.Length < 2) { Console.WriteLine("Usage: ExcelConverter.exe <input_file> <output_format>"); return; } string inputFile = args[0]; string outputFormat = args[1]; Application excelApp = new Application(); Workbook workbook = excelApp.Workbooks.Open(inputFile); Worksheet worksheet = workbook.ActiveSheet; Range range = worksheet.UsedRange; switch (outputFormat) { case "csv": ConvertToCsv(range); break; case "xml": ConvertToXml(range); break; case "json": ConvertToJson(range); break; default: Console.WriteLine($"Unsupported output format: {outputFormat}"); break; } workbook.Close(); excelApp.Quit(); } static void ConvertToCsv(Range range) { string csv = ""; for (int row = 1; row <= range.Rows.Count; row++) { string[] values = Enumerable.Range(1, range.Columns.Count) .Select(col => range.Cells[row, col].Value.ToString()) .ToArray(); csv += string.Join(",", values) + Environment.NewLine; } Console.WriteLine(csv); } static void ConvertToXml(Range range) { string xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + Environment.NewLine; xml += "<table>" + Environment.NewLine; for (int row = 1; row <= range.Rows.Count; row++) { xml += "<row>" + Environment.NewLine; for (int col = 1; col <= range.Columns.Count; col++) { string cellValue = range.Cells[row, col].Value.ToString(); xml += $"<col{col}>{cellValue}</col{col}>" + Environment.NewLine; } xml += "</row>" + Environment.NewLine; } xml += "</table>" + Environment.NewLine; Console.WriteLine(xml); } static void ConvertToJson(Range range) { dynamic table = new System.Dynamic.ExpandoObject(); table.rows = Enumerable.Range(1, range.Rows.Count) .Select(row => { dynamic rowData = new System.Dynamic.ExpandoObject(); for (int col = 1; col <= range.Columns.Count; col++) { string colName = $"col{col}"; string cellValue = range.Cells[row, col].Value.ToString(); ((IDictionary<string, object>)rowData)[colName] = cellValue; } return rowData; }) .ToList(); string json = JsonConvert.SerializeObject(table, Formatting.Indented); Console.WriteLine(json); } } } ``` 该程序使用命令行参数来指定输入文件和输出格式,例如: ``` ExcelConverter.exe input.xlsx csv ``` 在上述示例中,程序将 `input.xlsx` 文件转换为 CSV 格式,并将结果输出到控制台。你可以根据需要修改程序代码,以支持更多的输出格式和选项。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值