繁体   English   中英

没有反射的动态方法调用

[英]Dynamic Method Invocation without Reflection

有谁知道我该如何动态地调用方法而不进行反思?

我将在下面尝试说明我的问题

假设我们有一个接口IMyInterfaceMyImplementation是一个实现IMyInterface 除此之外,我还有一个通用的代理类MyProxy<T> where T : IMyInterface 在此代理中,我希望将所有调用包装到MyImplementation中定义的所有方法以及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();

例如持有人将返回一些包装,将实施IMyInterface ,并且将包裹已注册myImplementation的真实实例。

正如我前面所说,我们有一个包装MyImplementationWrapper实现IMyInterface ,有命名的方法有以下身体的方法

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

因此,有两个问题:a)如何自动为myImplementationInstance创建包装器(我不t want to know anything about object that will be registred in Holder中注册的t want to know anything about object that will be registred in ) b) How can I dynamically invoke the methods of通过包装器) b) How can I dynamically invoke the methods of myImplementationInstance` ) b) How can I dynamically invoke the methods of

首先是第一件事。 您确定反射不会太慢以满足您的需求吗? 不要进行传闻-自己进行测试。

编辑:包括使用动态

其次,如果您使用的是.net 3.5或.net 4.0,则可以使用Iron Python(或在4.0的情况下-任何DLR语言或动态语言)进行动态调用。

DLR是针对此类问题的最佳解决方案。 在C#中,您可以使用dynamic关键字访问dlr

我不确定您要达到什么目标。 听起来,您想要的是一个decorator ,它不需要反射。

似乎您正在尝试重新实现多态性...

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);
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM