有谁知道如何在没有反射的情况下动态调用方法?
我会尝试在下面指出我的问题
假设我们有一个接口IMyInterface
,MyImplementation
是IMyInterface
的一个实现。除此之外,我还有一个通用代理类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`
答案 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”类型