2010-05-05 52 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)