2011-08-21 25 views
5

Tôi đang làm việc về một thứ cần phải thực hiện trong hợp đồng (được chỉ định làm giao diện) và tạo một cá thể khi không có bất kỳ lớp bê tông được xác định chính thức nào đáp ứng giao diện này.Thư viện nguồn mở để tạo các loại cụ thể từ các giao diện trong thời gian chạy?

Một ví dụ về cú pháp là như thế này:

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

Tôi đã nhìn thấy các thư viện .NET khác và các khuôn khổ cung cấp hành vi như thế này (NServiceBus nói đến cái tâm), và tôi tự hỏi nếu có một Thư viện của bên thứ ba tóm tắt gen mã thời gian chạy. Tôi nghĩ Castle DynamicProxy sẽ là một nơi để xem xét, nhưng điều này dường như tập trung hoàn toàn vào proxy và chặn, và dường như không để lộ khía cạnh tạo mã.

Tôi có thể viết một triển khai sử dụng Reflection.Emit để tạo lớp trên bay, tuy nhiên tôi muốn sử dụng một thư viện nguồn mở vững chắc hơn nếu có.

Mọi đề xuất?

+0

Tôi tò mò: Giao diện với các phương thức được hỗ trợ như thế nào? Làm thế nào để bạn có ý định chỉ định một thực hiện tùy chỉnh của một phương pháp với cú pháp đó? –

+0

Giao diện với các phương thức không được hỗ trợ –

+0

Tôi thấy mã tương tự trong BLTookit – adontz

Trả lời

1

Còn thư viện nhại - NMock và RhinoMocks thì sao?

Bạn cũng có thể thêm triển khai vào các loại cụ thể bằng cách sử dụng dấu/kỳ vọng.

Tê giác nói riêng có cú pháp dựa trên lambda đẹp cho loại điều bạn muốn.

Điều này không đáp ứng đầy đủ nhu cầu của bạn?

Một cái gì đó như thế này?

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

giao diện Impromptu là những gì bạn cần: - http://code.google.com/p/impromptu-interface/

Tôi đã sử dụng nó để tạo polymorphic types in .NET.

Bạn cũng có thể xem Clay.

+0

Tôi đã cố gắng tránh xa Động. Tuy nhiên, công cụ đó khá tuyệt. –

+1

@ Jonathan-Holland trong trường hợp sử dụng mà bạn mô tả sẽ không yêu cầu bạn thực sự thấy bất kỳ việc sử dụng động nào trong mã của bạn khi sử dụng ngẫu hứng (mặc dù nó sẽ xảy ra phía sau hậu trường). Ví dụ thực hiện: 'public T Tạo (Hành động init) trong đó T: class {var message = new ExpandoObject(). ActLike (); init (tin nhắn); return message;} ' – jbtule

Các vấn đề liên quan