2011-08-21 63 views
5

我正在处理一些需要合约(指定为接口)的事情,并且在运行中创建一个实例,而没有任何正式定义的符合此接口的具体类。用于在运行时从接口生成具体类型的开源库?

语法的一个例子是这样的:

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

我见过的其他.NET库和框架提供了这样的行为(NServiceBus想到),我想知道是否有第三方库将运行时代码提取出来。我认为Castle DynamicProxy应该是一个可以看的地方,但是这似乎完全集中在代理和拦截上,似乎并没有公开代码生成方面。

我可以写一个使用Reflection.Emit来实时创建类的实现,但是我宁愿使用一个可靠的开源库(如果存在的话)。

有什么建议吗?

+0

我很好奇:如何支持与方法的接口?你打算如何使用该语法指定方法的自定义实现? –

+0

不支持与方法的接口 –

+0

我在BLTookit – adontz

回答

1

嘲笑图书馆 - NMock和RhinoMocks怎么样?

您也可以使用存根/期望将实现添加到具体类型。

犀牛特别是有一个很好的lambda为基础的语法,你想要的东西。

这是不是完全满足您的需求?

这样的事情?

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

即兴界面是你所需要的: - http://code.google.com/p/impromptu-interface/

我用它来创建polymorphic types in .NET

你也可以看看Clay

+0

中看到类似的代码我试图远离Dynamic。不过那东西很酷。 –

+1

@你在描述的用例中,Jonathan-Holland不会要求你在使用即兴表达时(尽管它会在幕后发生)实际看到代码中的动态用法。示例实现:'public T Create (Action init)其中T:class {var message = new ExpandoObject()。ActLike (); INIT(消息);返回消息;}' – jbtule