[英]Dynamic Method Invocation without Reflection
有谁知道我该如何动态地调用方法而不进行反思?
我将在下面尝试说明我的问题
假设我们有一个接口IMyInterface
和MyImplementation
是一个实现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.