C# Dynamic之:ExpandoObject,DynamicObject,DynamicMetaOb的应用(下)

下面是详细的攻略:

C#Dynamic之:ExpandoObject,DynamicObject,DynamicMetaObject的应用(下)

一、ExpandoObject

ExpandoObject是一个动态类型,它允许我们在运行时添加或删除属性,甚至可以动态更改属性的类型。ExpandoObject非常方便,可以用来处理一些未知的数据结构。

1. 添加属性

我们可以使用ExpandoObject来动态地添加属性。例如,我们可以利用它来创建一个JavaScript风格的字典。

dynamic dynamicObj = new ExpandoObject();
dynamicObj.first = "John";
dynamicObj.last = "Doe";
dynamicObj.address = new ExpandoObject();
dynamicObj.address.street = "123 Main St";
dynamicObj.address.city = "Seattle";
dynamicObj.address.zip = "98101";

在上面的示例中,我们创建了一个dynamic类型的对象dynamicObj,然后动态地添加了first、last、address三个属性。其中,address属性又是一个ExpandoObject类型的对象,我们又动态地为它添加了street、city和zip三个属性。

2. 获取属性

我们可以像访问普通对象一样,通过.操作符来访问ExpandoObject上的属性。

Console.WriteLine(dynamicObj.first); // John
Console.WriteLine(dynamicObj.last); // Doe
Console.WriteLine(dynamicObj.address.street); // 123 Main St
Console.WriteLine(dynamicObj.address.city); // Seattle
Console.WriteLine(dynamicObj.address.zip); // 98101

3. 删除属性

我们也可以使用ExpandoObject来动态地删除属性。

((IDictionary<string, object>)dynamicObj).Remove("address");

在上面的示例中,我们将address属性从dynamicObj中删除了。

二、DynamicObject

DynamicObject是一个抽象类,它提供了一些方法来让我们自定义动态对象的行为。我们可以继承DynamicObject类来创建自己的动态类型,并重写它提供的方法来实现所需的行为。

1. 重写TryGetMember方法

我们可以通过重写DynamicObject类的TryGetMember方法来提供对动态对象的成员的访问行为。

public class DynamicDictionary : DynamicObject
{
    private Dictionary<string, object> _dictionary = new Dictionary<string, object>();

    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        string name = binder.Name.ToLower();
        return _dictionary.TryGetValue(name, out result);
    }

    public void Add(string key, object value)
    {
        _dictionary[key.ToLower()] = value;
    }

    // other methods omitted for brevity
}

在上面的示例中,我们创建了一个DynamicDictionary类,继承自DynamicObject,它包含了一个Dictionary,就是我们要动态添加属性的字典。我们重写了TryGetMember方法,当访问DynamicDictionary的一个成员时,它会尝试从字典中获取该成员。我们还添加了一个Add方法,用来动态地向字典中添加属性。

使用示例:

dynamic dict = new DynamicDictionary();
dict.Name = "John";
dict.Age = 20;

Console.WriteLine(dict.Name); // John
Console.WriteLine(dict.Age); // 20

在上面的示例中,我们创建了一个dynamic类型的对象dict,它是DynamicDictionary的实例。然后我们动态地为dict添加了两个属性Name和Age。接着,我们通过dict.Name和dict.Age来访问这两个属性,它们的值分别是"John"和20。

2. 重写TryInvokeMember方法

我们还可以通过重写DynamicObject类的TryInvokeMember方法来提供对动态对象的方法调用行为。

public class DynamicCalculator : DynamicObject
{
    public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
    {
        var arg1 = (double)args[0];
        var arg2 = (double)args[1];
        switch (binder.Name.ToLower())
        {
            case "add":
                result = arg1 + arg2;
                return true;
            case "subtract":
                result = arg1 - arg2;
                return true;
            case "multiply":
                result = arg1 * arg2;
                return true;
            case "divide":
                result = arg1 / arg2;
                return true;
            default:
                result = null;
                return false;
        }
    }
}

在上面的示例中,我们创建了一个DynamicCalculator类,它继承自DynamicObject。我们重写了TryInvokeMember方法,当我们调用DynamicCalculator的一个方法时,它会根据方法名动态执行相应的操作。例如,当我们调用Add(2,3)时,它会返回5,因为2+3=5。

使用示例:

dynamic calc = new DynamicCalculator();
Console.WriteLine(calc.Add(2, 3)); // 5
Console.WriteLine(calc.Subtract(5, 2)); // 3
Console.WriteLine(calc.Multiply(3, 4)); // 12
Console.WriteLine(calc.Divide(10, 2)); // 5

在上面的示例中,我们创建了一个dynamic类型的对象calc,它是DynamicCalculator的实例。然后我们动态地调用了它的四个方法Add、Subtract、Multiply和Divide,它们的返回值分别是5、3、12和5。

三、DynamicMetaObject

DynamicMetaObject是DynamicObject的一个扩展类,它提供了一些方法来让我们更加灵活地定义动态对象的行为。我们可以继承DynamicMetaObject类来创建自己的动态类型,并重写它提供的方法来实现所需的行为。

1. 重写GetDynamicMemberNames方法

我们可以通过重写DynamicMetaObject类的GetDynamicMemberNames方法来动态地返回动态对象的所有属性。

public class DynamicDictionary : DynamicObject
{
    private Dictionary<string, object> _dictionary = new Dictionary<string, object>();

    public override IEnumerable<string> GetDynamicMemberNames()
    {
        return _dictionary.Keys;
    }

    // other methods omitted for brevity
}

在上面的示例中,我们重写了GetDynamicMemberNames方法,它会返回_dynamicDictionary的所有属性名。这使得我们可以使用foreach循环来遍历_dynamicDictionary的所有属性。

使用示例:

dynamic dict = new DynamicDictionary();
dict.Name = "John";
dict.Age = 20;

foreach (var prop in dict)
{
    Console.WriteLine("{0} = {1}", prop, dict[prop]);
}

在上面的示例中,我们创建了一个dynamic类型的对象dict,它是DynamicDictionary的实例。然后我们动态地为dict添加了两个属性Name和Age。接着,我们使用foreach循环遍历dict的所有属性,并输出它们的名称和值。

2. 重写TryConvert方法

我们还可以通过重写DynamicMetaObject类的TryConvert方法来提供类型转换的行为。例如,当我们将一个动态对象转换为某个具体的类型时,它会调用我们重写的TryConvert方法,来决定如何将动态对象转换为目标类型。

public class DynamicPerson : DynamicObject
{
    private string _name;
    private int _age;

    public DynamicPerson(string name, int age)
    {
        _name = name;
        _age = age;
    }

    public override bool TryConvert(ConvertBinder binder, out object result)
    {
        if (binder.Type == typeof(string))
        {
            result = string.Format("{0} ({1})", _name, _age);
            return true;
        }
        else if (binder.Type == typeof(int))
        {
            result = _age;
            return true;
        }
        else
        {
            result = null;
            return false;
        }
    }
}

在上面的示例中,我们创建了一个DynamicPerson类,它继承自DynamicObject。我们重写了TryConvert方法,当我们将DynamicPerson对象转换为字符串或整数时,它会返回相应的结果。

使用示例:

dynamic person = new DynamicPerson("John Doe", 20);
string strNameAge = (string)person;
int intAge = (int)person;

Console.WriteLine(strNameAge); // John Doe (20)
Console.WriteLine(intAge); // 20

在上面的示例中,我们创建了一个dynamic类型的对象person,它是DynamicPerson的实例。然后,我们将person分别转换为字符串和整数,它们分别是"John Doe (20)"和20。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# Dynamic之:ExpandoObject,DynamicObject,DynamicMetaOb的应用(下) - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • .Net Core中自定义认证实现

    在ASP.NET Core中,可以使用自定义认证实现来实现自定义身份验证方案。在本攻略中,我们将介绍如何在ASP.NET Core中实现自定义认证实现。 步骤一:创建ASP.NET Core MVC项目 首先,需要创建一个ASP.NET Core MVC项目。可以使用以下命令在命令行中创建一个新的ASP.NET Core MVC项目: dotnet new …

    C# 2023年5月17日
    00
  • C#标识符的使用小结

    我将详细讲解 “C#标识符的使用小结”: 什么是标识符? 在C#编程语言中,标识符是用来表示各种元素名称(如变量、方法、命名空间等)的一个字符序列。合法的标识符必须符合以下规则: 标识符由字母、数字或下划线(_)组成 第一个字符必须是字母或下划线 标识符不能与C#语言的关键字(如if、for等)相同 标识符区分大小写 命名规范 在使用标识符时应遵循以下规范:…

    C# 2023年5月31日
    00
  • .NET Core跨平台串口通讯使用SerialPortStream基础类库问题解决

    .NET Core跨平台串口通讯使用SerialPortStream基础类库问题解决 串口通讯在很多行业应用中都有着重要的地位,而串口通讯的跨平台解决方案在.NET Core 3.0之后,就有了更好的支持。本文将介绍如何使用SerialPortStream基础类库进行.NET Core跨平台串口通讯,并解决其中的常见问题。 安装SerialPortStrea…

    C# 2023年6月3日
    00
  • ASP.NET MVC验证码功能实现代码

    当用户填写表单时,防止自动化脚本恶意提交表单的一种有效方式是通过验证码来验证用户的身份。下面是一个ASP.NET MVC验证码功能实现的完整攻略。 步骤一:在视图中添加验证码 添加一个表单或者用户输入数据的其他元素,然后在元素下方放置一个图片框来显示验证码的图片。图片框应该包含一个用于输入验证码的文本输入框,和一个刷新验证码的按钮。下面是一个示例: <…

    C# 2023年5月31日
    00
  • C# 关于AppDomain的一些总结

    关于C#中的AppDomain,我来进行详细的说明和总结。 一、什么是AppDomain 在C#中,每个线程都属于一个应用程序域(AppDomain)。AppDomain是.NET中用于进程隔离的一种技术,可以将应用程序分隔为不同的域,从而提高了程序的安全性和稳定性。 AppDomain可以看作是CLR(公共语言运行库)中的一个隔离容器,它可以加载和执行单独…

    C# 2023年5月14日
    00
  • C#最简单的字符串加密解密方法

    C#最简单的字符串加密解密方法 介绍 在应用程序开发过程中,加密解密是一个非常重要的操作,特别是在涉及到用户隐私数据时。本文将介绍一种使用C#编程语言实现最简单的字符串加密解密方法。 加密解密方法介绍 在C#中字符串加密解密的方法有很多种,本文将使用Base64算法进行加密解密。Base64算法是一种基于64个字符来表示二进制数据的方法,主要用于在HTTP协…

    C# 2023年6月8日
    00
  • abp(net core)+easyui+efcore实现仓储管理系统——模块管理升级之上(六十一)

     Abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+easyui+efcore实现仓储管理系统——解决方案介绍(二) abp(net core)+easyui+efcore实现仓储管理系统——领域层创建实体(三…

    C# 2023年4月17日
    00
  • c# 生成随机时间的小例子

    下面是“c# 生成随机时间的小例子”的完整攻略。 需求分析 我们希望在c#中生成一些随机的时间点(可以是任意时间,也可以是在某个时间范围内的随机时间),以便在一些测试场景下使用。 根据需求,我们需要实现的功能如下: 生成指定个数的随机时间点 可以指定时间范围 生成的时间点要保证随机性 为了实现这些功能,我们可以使用c#提供的DateTime类型和Random…

    C# 2023年6月1日
    00
合作推广
合作推广
分享本页
返回顶部