2013-05-28 2 views
0

Можно ли сделать уже скомпилированный класс реализовывать определенный интерфейс во время выполнения, пример:Реализация интерфейса во время выполнения

public interface ISomeInterface { 
    void SomeMethod(); 
} 

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

это возможно, если да, то каким образом?

+0

No. Почему вы хотите это сделать? – TyCobb

+1

Вы не можете заставить MyClass реализовать ISomeInterface, но вы можете сгенерировать класс, полученный из MyClass, и реализовать ISomeInterface, используя Reflection.Emit или другую технику. –

+2

Вы можете использовать технику, предложенную @ThomasLevesque, но если вы дадите нам ваш прецедент, возможно, лучший способ достичь waht вы хотите – 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(); 
Смежные вопросы