2010-10-19 16 views
7

Básicamente lo que me gustaría saber es si hay alguna manera de agregar nuevas 'declaraciones' a los lenguajes basados ​​en .net. Un ejemplo de lo que estoy buscando sería algo así como introducir un public class MyClass decoratorOf ClassWithLotsOfMethods y en tiempo de precompilación cambiar eso para que sea una clase normal que anula todo por defecto pero los métodos que defino.¿Extender el lenguaje C#?

Otro ejemplo sería las propiedades de auto .NET 3.5, o métodos de extensión, etc

Esto es sólo por diversión, no es que yo realmente quiero hacer esto, sólo por curiosidad, si es posible

Gracias! Seba

+0

Parece que usted está pensando en la forma en que había al igual que los métodos de extensión para trabajar: si Foo se declara como una Clase de Extensión de Barra, entonces un objeto declarado como Foo se consideraría una Barra, excepto el procesamiento en tiempo de compilación de métodos y propiedades autoestáticas de Foo que incondicionalmente sombrear los de Bar (incluso cuando los métodos correspondientes existen en Bar). Tal diseño permitiría agregar miembros a Bar sin romper el código que usa Foo, incluso si dichos miembros coinciden con los nombres de las extensiones de Foo. Lástima que no conozco ninguna manera de hacer que el idioma lo respalde. – supercat

+0

@supercat: deberías echarle un vistazo a [Scala implicits] (http://www.artima.com/weblogs/viewpost.jsp?thread=179766) –

Respuesta

8

C# no permite esto. Por supuesto, puede ajustar el IL generado con un compilador posterior (como CciSharp).

Algunos lenguajes .NET alternativos que permiten extensiones son Nemerle y Boo.

5

No hay nada incorporado.

Por supuesto, puede utilizar un preprocesador, pero eso no lo hará popular.

+1

Sí, mira a Simula, todo lo que hicieron fue inventar objetos programación orientada. O C++, eso no es muy popular, ¿verdad? :-) – Ken

+0

@Ken: ¿cómo agregar un pre-procesador lo haría popular? ¿Y qué tiene esto que ver con Simula (que en realidad no era una extensión de ALGOL)? –

+0

No veo ninguna razón para creer que el uso de un preprocesador tenga un efecto particular en la popularidad de uno, ya que hay buenos ejemplos de popularidad extrema e impopularidad con y sin uno. Y (si hay que creer una docena de historias separadas que encontré en Internet) Simula comenzó su vida como un preprocesador para Algol (ya que C++ comenzó su vida como un preprocesador para C), aunque (como C++) pronto tomó una vida de su propio. – Ken

3

No es que me conocen, pero echar un vistazo a PostSharp y T4 Templates y ver si se puede resolver su problema :)

+0

He construido decoradores con T4 antes. Funcionó bien, y no requirió que se instalara nada adicional –

+0

T4 sería mi primera opción. –