2010-05-05 69 views
2

我猜想这是不可能的,但进一步挖掘之前是有办法做这样的事情:C# - 动态关键字和接口实现

public void ProcessInterface(ISomeInterface obj) {} 

//... 

dynamic myDyn = GetDynamic<ISomeInterface>() 
ProcessInterface(myDyn); 

我见过post主张,但听起来好像没有包括在内。

一个小上下文:.Net程序集通过COM公开 - > Silverlight应用程序消费接口实现类。很高兴通过接口来引用对象。我真的不希望这是什么意图...

回答

6

不,dynamic不会让一个类型伪装成实现一个接口(即使它有,通过dynamic,所有的方法)。传递给ProcessInterface基本上带走了dynamic

dynamic取决于调用代码与实现对象一样多。更多,甚至。

可以然而让使用鸭子类型的接口封装:

class Foo : IBar { 
    readonly dynamic duck; 
    public Foo(dynamic duck) { this.duck = duck; } 

    void IBar.SomeMethod(int arg) { 
     duck.SomeMethod(arg); 
    } 
    string IBar.SomeOtherMethod() { 
     return duck.SomeOtherMethod(); 
    } 
} 
interface IBar { 
    void SomeMethod(int arg); 
    string SomeOtherMethod(); 
} 
+0

这就是我所期望的。我认为每当我的代码得到像这样的hacky想法流行到我的脑海中... – 2010-05-05 04:06:41

+0

@Adam - 另请参阅我添加的hacky想法.. – 2010-05-05 04:08:39

+0

这将确保提升我的黑客级别......现在编写一些代码来发射Foo在运行时... – 2010-05-05 04:12:53

2

我不认为我理解你的观点。如果你知道你正在处理的确切接口,为什么你需要使用dynamic

+0

是的,但我想知道它是否可能。 – 2010-05-05 04:07:15

2

您可以使用开源Impromptu-Interface做到这一点。这是一种自动化的方式来制作接口包装并使用DLR。 Impromptu.ActLike<ISomeInterface>(myDyn)