2011-08-21 8 views
5

Pracuję nad czymś, co wymaga zawarcia umowy (określonej jako interfejs) i tworzenia instancji w locie, bez formalnie zdefiniowanej konkretnej klasy, która spełnia ten interfejs.Biblioteka Open Source do generowania konkretnych typów z interfejsów w czasie wykonywania?

Przykładem składni jest tak:

IExampleMessage message = MessageBuilder.Create<IExampleMessage>(x => { 
    x.PropertyA = "Test"; 
    x.PropertyB = 5; 
}); 

Widziałem inne biblioteki .NET i ram oferują takiego zachowania (NServiceBus przychodzi do głowy), i zastanawiam się, czy istnieje Zewnętrzna biblioteka, która usuwa gen kodu runtime. Sądziłem, że Castle DynamicProxy będzie miejscem do patrzenia, ale wydaje się, że skupia się całkowicie na pośredniczeniu i przechwytywaniu, i nie wydaje się ujawniać aspektu generowania kodu.

Mógłbym napisać implementację, która używa Reflection.Emit do utworzenia klasy w locie, jednak wolałbym użyć biblioteki otwartego źródła, jeśli taka istnieje.

Wszelkie sugestie?

+0

Jestem ciekawy: w jaki sposób obsługiwane będą interfejsy z metodami? W jaki sposób zamierzasz wprowadzić niestandardową implementację metody z tą składnią? –

+0

Interfejsy z metodami nie są obsługiwane –

+0

Widziałem podobny kod w BLTookit – adontz

Odpowiedz

1

Co z kpiącymi bibliotekami - NMock i RhinoMocks?

Można dodawać implementacje do konkretnych typów przy użyciu kodów/oczekiwań.

Nosorożec ma w szczególności ładną składnię opartą na lambdzie dla potrzebnych rzeczy.

Czy to nie spełnia twoich potrzeb?

Coś takiego?

IExampleMessage message = MockRepository.GenerateStub<IExampleMessage>(); 
message .Stub(x => x.PropertyA).Return("Text")  
message .Stub(x => x.PropertyB).Return(5) 
2

Impromptu interfejs jest to, czego potrzebujesz: - http://code.google.com/p/impromptu-interface/

Używałem go do tworzenia polymorphic types in .NET. Można uzyskać również Clay.

+0

Starałem się trzymać z daleka od Dynamic. Jednak te rzeczy są całkiem fajne. –

+1

@ Jonathan-Holland w opisywanym przypadku użycia nie wymagałby użycia dynamicznego kodu podczas używania impromptu (choć dzieje się to za kulisami). Przykładowa implementacja: 'public T Create (Action init) gdzie T: class {var message = new ExpandoObject(). ActLike (); init (wiadomość); return message;} ' – jbtule