.NET(C#)中,如果一个类没有实现接口但仍然需要使用多态传参的效果,可以考虑以下替代方法。本文主要介绍.Net(C#)中,指定的类没有实现特定的接口,但要实现多态的方式向方法传递参数,即动态实现接口的方法代码。

示例代码

//类
class Person {
    public string Greet() => "Hello!";
}
//接口和方法
interface IGreetable {
    string Greet();
} 
void PrintGreeting(IGreetable g) => Console.WriteLine(g.Greet());

动态实现IGreetable接口,使得Person对象在没有实现 IGreetable接口情况下,能将Person对象参数传入PrintGreeting方法中。

1、使用impromptu-interface实现

如果类没有实现某个接口,而又想使用多态传参的方式,可以通过 Impromptu-Interface 库来实现动态接口实现。Impromptu-Interface 提供了一种机制,使对象动态实现接口,避免修改现有类的代码。net4.0 / netstd2.0框架可以使用静态接口包装任何对象(静态或动态),即使它没有从它继承。它通过在代理中发出缓存的动态绑定代码来实现此目的。

文档https://github.com/ekonbenefits/impromptu-interface

1) ImpromptuInterface安装引用

使用Nuget图形管理器搜索"ImpromptuInterface" => 找到点击"安装"。

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

2) 实现代码

var person = new Person();
var greeter = person.ActLike<IGreetable>();

2、使用dynamic类型实现

将参数类型声明为dynamic,编译器会延迟到运行时才进行类型检查和方法调用。

class GreetableWrapper : IGreetable
{
private dynamic _wrapped;
public GreetableWrapper(dynamic wrapped)
{
_wrapped = wrapped;
}
public string Greet()
{
return _wrapped.Greet();
}
}
static void PrintGreeting(IGreetable g) => Console.WriteLine(g.Greet());
static void Main(string[] args)
{
PrintGreeting(new GreetableWrapper(new Person()));
Console.ReadLine();
}

注意:在包装类中失去了类型安全性。

3、object作为参数类型

在方法中使用object作为参数类型,可以传入任何类型的对象。在方法内部使用is运算符或as运算符进行类型检查,并根据类型进行不同的处理。

public void Process(object obj)
{
    if (obj is DerivedClass1)
    {
        // 处理DerivedClass1类型对象
    }
    else if (obj is DerivedClass2)
    {
        // 处理DerivedClass2类型对象
    }
}

推荐文档