Aar*_*sen 33 c# reflection class system.reflection
注意:我知道这在实践中是一个糟糕的主意; 我只是好奇CLR允许你做什么,目的是创建某种'在创建它后修改类'预处理器.
假设我有以下类,它在另一个程序集中定义,所以我无法更改它.
class Person {
public string Greet() => "Hello!";
}
Run Code Online (Sandbox Code Playgroud)
我现在定义一个接口和一个方法,如下所示:
interface IGreetable {
string Greet();
}
// ...
void PrintGreeting(IGreetable g) => Console.WriteLine(g.Greet());
Run Code Online (Sandbox Code Playgroud)
该类Person没有明确的实现IGreetable,但它可以不对其方法进行任何修改.
有了这个,有什么方法,使用Reflection,DLR或其他任何东西,其中一个实例Person可以成功传递到PrintGreeting不修改上面的任何代码?
小智 28
尝试使用库Impromptu-Interface
[Impromptu-Interface]框架允许您使用静态接口包装任何对象(静态或动态),即使它没有从它继承.它通过在代理中发出缓存的动态绑定代码来实现此目的.
这允许你做这样的事情:
var person = new Person();
var greeter = person.ActLike<IGreetable>();
Run Code Online (Sandbox Code Playgroud)
您可以使用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();
}
Run Code Online (Sandbox Code Playgroud)