2013-05-28 42 views
0

接口是否有可能使已經編譯的類實現在運行時某個接口,一個例子:實現在運行時

public interface ISomeInterface { 
    void SomeMethod(); 
} 

public class MyClass { 
    // this is the class which i want to implement ISomeInterface at runtime 
} 

這是可能的,如果是的話怎麼辦?

+0

號,你爲什麼要這麼做? – TyCobb

+1

你不能讓MyClass實現ISomeInterface,但是你可以使用Reflection.Emit或其他一些技術來生成一個派生自MyClass的類並實現ISomeInterface。 –

+2

您可以使用@ThomasLevesque建議的技術,但是如果您向我們提供您的用例,則可能有更好的方法來實現您想要的效果。 – Kenneth

回答

5

差不多。你可以使用即興接口。

https://github.com/ekonbenefits/impromptu-interface

https://github.com/ekonbenefits/impromptu-interface/wiki/UsageBasic基本例如:

using ImpromptuInterface; 

public interface ISimpleClassProps 
{ 
    string Prop1 { get; } 
    long Prop2 { get; } 
    Guid Prop3 { get; } 
} 

var tAnon = new {Prop1 = "Test", Prop2 = 42L, Prop3 = Guid.NewGuid()}; 
var tActsLike = tAnon.ActLike<ISimpleClassProps>(); 
+1

哦,非常好......我不知道那個圖書館,但爲了以防萬一,我會牢記它。 –

+0

確實很棒,這可能是正確性最接近的答案,但我會給這個問題一些時間來看看是否還有更好的方法。編輯:這看起來非常有希望,因爲項目描述似乎是針對我正在尋找的確切領域。 –

2

您可以使用Adapter模式,使其出現在實現該接口。這看起來有點像這樣:

public interface ISomeInterface { 
    void SomeMethod(); 
} 

public class MyClass { 
    // this is the class which i want to implement ISomeInterface at runtime 
} 

public SomeInterfaceAdapter{ 
    Myclass _adaptee; 
    public SomeInterfaceAdapter(Myclass adaptee){ 
     _adaptee = adaptee; 
    } 
    void SomeMethod(){ 
     // forward calls to adaptee 
     _adaptee.SomeOtherMethod(); 
    } 
} 

使用這會看起來有點像這樣:

Myclass baseobj = new Myclass(); 
ISomeInterface obj = new SomeInterfaceAdapter(baseobj); 
obj.SomeMethod();