使对象在代码中动态实现接口

Jan*_*Jan 7 c# castle-dynamicproxy cop

我想让这个测试通过 - 任何人都知道如何做到这一点?

public class Something
{
    public string Name {get; set}
}

public interface IWithId
{
    public Guid Id {get; set}
}

public class IdExtender 
{
    public static Object Extend(object toExtend)
    {
        ...?
    }
}

public class Tests 
{
    [Test]
    public void Should_extend_any_object()
    {
        var thing = new Something { Name = "Hello World!"};
        var extended = IdExtender.Extend(thing);
        Assert.IsTrue(extended is IWithId);
        Assert.IsTrue(extended.Id is Guid);
        Assert.IsTrue(extened.Name == "Hello World!");
    }
}
Run Code Online (Sandbox Code Playgroud)

我猜这样的事情可以用城堡动态代理,林福等完成......但是怎么样?

Krz*_*mic 3

使用 Castle DP(显然)

好吧 - 您将必须创建一个新对象来返回,因为在程序执行时您无法让现有类型获得新接口。

为此,您需要创建一个代理,然后将预先存在的对象的状态复制到代理上。DP 不会这样做 OOTB。在 v2.5 中,您可以将新的类代理与目标一起使用,但这只有在类型上的所有属性都是虚拟的时才有效。

反正。IWithId您可以通过将代理与实现该属性的现有对象混合来使新类型获得接口。然后对接口成员的调用将被转发到对象。

或者,您可以将其作为附加接口提供来实现,并让拦截器充当实现者的角色。