没有反射的动态方法调用

时间:2010-09-14 22:12:25

标签: c# .net multithreading

有谁知道如何在没有反射的情况下动态调用方法?

我会尝试在下面指出我的问题

假设我们有一个接口IMyInterfaceMyImplementationIMyInterface的一个实现。除此之外,我还有一个通用代理类MyProxy<T> where T : IMyInterface。在这个代理中,我想要对所有在MyImplementation和此类的所有继承者中定义的方法进行所有调用。我想要实现的目的是动态方法调用。在反射的情况下,一切都将是透明的,但据我所知,它可能会很慢。有谁知道解决方案可能会更快?

非常感谢!

- 更新

嗯,看起来我以前的描述并不好,所以我会再次尝试描述我的问题。举例:)

所以,让我们假设我们有以下代码:

public interface IMyInterface
{
     void Method();
}

public class MyImplementation : IMyInterface
{
     public void Method()
     {
          Console.WriteLine("Yeaah!");
     }
}

我忘了提到的重点是我们有一个名为Holder的类。应按以下方式使用此类

var holder = // the way of instantiation doesn`t really matters
holder.Register(myImplementationInstance);

var myInterfaceInstance = holder.Resolve<IMyInterface>();
myInterfaceInstance.Method();

Holder实例将返回一些将实现IMyInterface的包装器,并将包装已注册的myImplementation的实例。

正如我上面所说,我们有一个包装器MyImplementationWrapper,它实现了IMyInterface,并且具有名为Method的方法,具有以下主体

public void Method()
{
    _wrappedInstance.Method();
}

所以,有两个问题 a)如何自动为myImplementationInstance创建包装器(我必须通过其包装器t want to know anything about object that will be registred in持有人) b) How can I dynamically invoke the methods of myImplementationInstance`

3 个答案:

答案 0 :(得分:1)

首先要做的事情。你确定反射对你的需求来说不是太慢吗?不要继续传闻 - 自己测试一下。

编辑:包括使用动态

其次,如果你在.net 3.5或.net 4.0中,那么你可以使用Iron Python(或者在4.0的情况下 - 任何DLR语言或动态)来进行动态调用。

DLR是这种事情的最佳解决方案。在C#中,您可以使用dynamic关键字访问dlr

答案 1 :(得分:0)

我不确定你想要实现的目标。听起来,你想要的是decorator,它不需要反射。

答案 2 :(得分:0)

这似乎是你试图重新实现多态...

class MyBaseImplementation
{
    public virtual void MyMethod()
    {
        Console.WriteLine("Base");
    }
}

class MyDerivedImplementation : MyBaseImplementation
{
    public override void MyMethod()
    {
        Console.WriteLine("Derived");
    }
}

static void DoSomething(MyBaseImplementation instance)
{
    instance.MyMethod();
}

static void Main(string[] args)
{
    MyBaseImplementation inst = new MyDerivedImplementation();
    DoSomething(inst);
}

这将打印“Derived”,即使函数中的参数是“MyBaseImplementation”类型