.Net(C#)类没有实现接口时使用多态传参的替代方法
时间:2022-11-01
示例代码:
//类 >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实现
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类型实现
注意:在包装类中失去了类型安全性
>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();
}
特别声明:本站部分内容收集于互联网是出于更直观传递信息的目的。该内容版权归原作者所有,并不代表本站赞同其观点和对其真实性负责。如该内容涉及任何第三方合法权利,请及时与824310991@qq.com联系,我们会及时反馈并处理完毕。