我已经得到了需要创建一个动态的代理。我希望此类包裹的另一类,并采取在它的公共接口、转发的电话对于这些功能:

class MyRootClass
{
    public virtual void Foo()
    {
        Console.Out.WriteLine("Foo!");
    }

}

interface ISecondaryInterface
{
    void Bar();
}

class Wrapper<T> : ISecondaryInterface where T: MyRootClass
{
    public Wrapper(T otherObj)
    {
    }

    public void Bar()
    {
        Console.Out.WriteLine("Bar!");
    }
}

这里就是我想要使用它:

Wrapper<MyRootClass> wrappedObj = new Wrapper<MyRootClass>(new MyRootClass());
wrappedObj.Bar();
wrappedObj.Foo();

产生:

Bar!
Foo!

任何想法?

什么是最简单的方式做到这一点?

什么是最好的方式做到这一点?

感谢这么多。

更新

我试过了以下Wernight的建议和实施这种使用C#4.0动代理。不幸的是,我仍然坚持。点的代理证明其他的接口,这是(通常情况下,通常会)的预期。使用DynamicObject)要求我改变所有的客户的信用'动态"而不是"ISecondaryInterface'.

有没有办法得到代理的对象,这样,当这包裹一,它通告(静态?) 它支持一的接口;当它包B,它通告,为支持B的接口?

更新2

例如:

class MySecretProxy : DynamicObject, ISecondaryInterface
{
    public override void TryInvokeMember(...) { .. }

    // no declaration of Bar -- let it be handled by TryInvokeMember
 }
有帮助吗?

解决方案

.净4 DynamicObject 可以帮助你实现这一目标。

早。净框架可以使用:

  • 一方面#
  • 包住AOP
  • Spring.NET
  • Aspect.NET
  • AspectDNG
  • 动代理
  • 撰写*
  • Loom.NET
  • PostSharp

这些框架使用的号码 技术注入的代码 之前和之后的执行 法。这些一般分为4 类别。

  • 集的注射 –我们在这里注入集码进入体内的 方法正在执行。(后急剧)
  • 运行时动态喷射 –使用技术,例如反映我们 调用的方法动态。
  • 类型的建设者注射 –有关运行时注,我们创建了一个类型的基础上 的类型,我们希望代理然后警长的请求,通过这种类型。(动态代理)
  • 容器喷射 –请求通过一个容器 调用代码之前和之后我们方法正在执行。

看看 完整的文章.

我知道, 城堡的项目's 动代理 通常被用(如同在 最低采购量 只是一个大项目)。


答复,更新题目

你写了什么不会编译。 动态 代理运行时产生的代码,所以你必须创建一个具体实例之类的你是代理某种方式或另一种。可以你想做的 AOP (面向方面编程)。

class MySecretProxy<T> : DynamicObject, T where T : new()
{
    private T _instance = new T();

    public override void TryInvokeMember(...) { ... }
}

MySecretProxy<Bar> bar;

其他提示

您是否查看了城堡项目的动态proxy?它可能会提供您最终试图实现的目标。看 http://www.castleproject.org/dynamicproxy/index.html

它也是开源的,因此您甚至可以在需要时分叉。

如果目标类型是接口或源自MarshalbyRefobject的接口,则可以使用RealProxy执行此操作。

你可能想看看 linfu 其中包含动态代理机制。

我知道Nhibernate用于懒惰加载的代理

城堡

linfu

弹簧字节码

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top