2010-10-19 95 views
7

基本上我想知道的是,如果有任何方法可以将基于.net的语言添加新的“语句”? 我正在寻找的一个例子就像是介绍public class MyClass decoratorOf ClassWithLotsOfMethods,在预编译的时候将它改为一个普通的类,它默认覆盖了所有的东西,但是我定义的方法。扩展C#语言?

另一个例子是在.NET 3.5自动属性,或扩展方法等

这仅仅是为了好玩,不是我真的想这样做,只是好奇,如果有可能

谢谢! Seba

+0

听起来像你想的我会的方式像扩展方法一样工作 - 如果Foo被声明为Bar的扩展类,那么声明为Foo的对象将被视为Bar,除了无条件地编译时处理Foo的自静态方法和属性影响Bar的那些(即使Bar中存在相应的方法)。这样的设计将允许成员添加到Bar而不破坏使用Foo的代码,即使这些成员与Foo的扩展名相匹配。太糟糕了,我不知道有什么办法让语言支持。 – supercat 2010-10-19 14:59:11

+0

@supercat:你应该看一看[Scala implicits](http://www.artima.com/weblogs/viewpost.jsp?thread=179766) – 2010-10-19 15:40:21

回答

8

C#不允许这样做。你当然可以用后编译器来调整生成的IL(如CciSharp)。

允许扩展的一些替代.NET语言是NemerleBoo

5

没有什么内置的。

你当然可以使用预处理器,但不会让你受欢迎。

+1

是的,看看Simula - 他们所做的只是发明了对象 - 面向程序设计或C++ - 这不是很受欢迎,是吗? :-) – Ken 2010-10-19 14:51:30

+0

@Ken:如何添加预处理器让他受欢迎?这与Simula(它实际上不是ALGOL的延伸)有什么关系? – 2010-10-19 19:23:48

+0

我认为没有理由相信预处理器的使用会对人气造成任何特别的影响,因为有很多非常流行和不受欢迎的好例子。并且(如果我在互联网上发现了十几个独立的历史记录),Simula开始作为Algol的预处理器(因为C++开始作为C的预处理器的生命),尽管(就像C++一样),它很快就发生了它的生命拥有。 – Ken 2010-10-20 05:14:49

3

不,我知道,但看看PostSharpT4 Templates,看看是否能解决你的问题:)

+0

我已经用T4构建了装饰器。它运行良好,并且不需要任何额外的安装 – 2010-10-19 14:14:23

+0

T4将是我的第一选择。 – 2010-10-19 14:19:59