.NET(C#) 使用ImpromptuInterface动态实现的静态接口(duck casting)

.NET (C#) 中,ImpromptuInterface 是一个库,可以在运行时动态实现接口,特别是当一个对象不显式实现该接口时。这种技术通常被称为 ’duck typing‘ 或 ’duck casting‘,意思是只要一个对象看起来像某个接口的实现,它就可以被动态转换为那个接口,而不需要显式实现该接口。本文主要介绍在代码中没有继承的接口,使用使用ImpromptuInterface动态实现继承的方法代码。

1、ImpromptuInterface的安装引用

通过Nuget引用,使用Nuget图形管理器=》搜索"ImpromptuInterface"=》找到然后点击"安装"。

相关文档VS(Visual Studio)中Nuget的使用

2、使用示例代码

通过 ImpromptuInterface,你可以将一个动态对象转换为某个接口的实现,前提是该对象的成员名称和接口一致。

using System;
using ImpromptuInterface;
using Dynamitey;

public interface IMyInterface
{
    string Prop1 { get; }
    long Prop2 { get; }
    Guid Prop3 { get; }
    bool Meth1(int x);
}

class Program
{
    static void Main()
    {
        // 匿名类,动态实现 IMyInterface 接口
        var anon = new
        {
            Prop1 = "Test",
            Prop2 = 42L,
            Prop3 = Guid.NewGuid(),
            // Meth1 方法实现
            Meth1 = 
            Return<bool>.Arguments<int>(it => it > 5)  
        };

        // 使用 ImpromptuInterface 动态实现接口
        var myInterface = anon.ActLike<IMyInterface>();

        // 调用接口的属性和方法
        Console.WriteLine($"Prop1: {myInterface.Prop1}");  
        // 输出: Test
        Console.WriteLine($"Prop2: {myInterface.Prop2}");  
        // 输出: 42
        Console.WriteLine($"Prop3: {myInterface.Prop3}");  
        // 输出: 随机生成的 Guid
        Console.WriteLine($"Meth1(4): {myInterface.Meth1(4)}");  
        // 输出: False
        Console.WriteLine($"Meth1(6): {myInterface.Meth1(6)}"); 
        // 输出: True
    }
}

using System;
using System.Dynamic;
using ImpromptuInterface;
using Dynamitey;

public interface IMyInterface
{
    string Prop1 { get; }
    long Prop2 { get; }
    Guid Prop3 { get; }
    bool Meth1(int x);
}

class Program
{
    static void Main()
    {
        // 创建一个动态 Expando 对象
        dynamic expando = new ExpandoObject();
        
        // 设置 ExpandoObject 的属性和方法
        expando.Prop1 = "Test";
        expando.Prop2 = 42L;
        expando.Prop3 = Guid.NewGuid();
        // 动态方法 Meth1
        expando.Meth1 = 
        Return<bool>.Arguments<int>(it => it > 5);  

        // 使用 Impromptu.ActLike 
        //将 ExpandoObject 动态转换为接口 IMyInterface
        IMyInterface myInterface = 
        Impromptu.ActLike<IMyInterface>(expando);

        // 调用接口的属性和方法
        Console.WriteLine($"Prop1: {myInterface.Prop1}");  
        // 输出: Test
        Console.WriteLine($"Prop2: {myInterface.Prop2}");  
        // 输出: 42
        Console.WriteLine($"Prop3: {myInterface.Prop3}");  
        // 输出: 随机生成的 Guid
        Console.WriteLine($"Meth1(4): {myInterface.Meth1(4)}");  
        // 输出: False
        Console.WriteLine($"Meth1(6): {myInterface.Meth1(6)}");  
        // 输出: True
    }
}

官方地址https://github.com/ekonbenefits/impromptu-interface

推荐阅读
cjavapy编程之路首页