En vista de la respuesta actualizada, en realidad estás no en busca de "métodos dinámicos", tanto como "objetos dinámicos" - de tal manera que es posible añadir nuevas propiedades y métodos para ellos en tiempo de ejecución. Si esto es correcto, entonces en .NET 4.0, se puede utilizar en conjunción con ExpandoObject
dynamic
:
dynamic foo = new ExpandoObject();
foo.Bar = 123; // creates a new property on the fly
int x = foo.Bar; // 123
// add a new method (well, a delegate property, but it's callable as method)
foo.Baz = (Func<int, int, int>)
delegate(int x, int y)
{
return x + y;
};
foo.Baz(1, 2); // 3
se puede tener "métodos dinámicos", también, con los árboles de expresión, y una vez que obtener un delegado para tal método , también puede crear una propiedad similar a un método invocable en un ExpandoObject
.
Para utilizar en consultas LINQ, desafortunadamente, no puede usar los inicializadores de objetos con ExpandoObject
; en el caso más sencillo, lo siguiente no se compilará:
var foo = new ExpandoObject { Bar = 123; }
La razón es que Bar
en este caso se buscará de forma estática como una propiedad de ExpandoObject
. Necesita que el receptor sea dynamic
para que esta característica se active, y no hay forma de hacerlo dentro de un inicializador de objetos. Como una solución para su uso en LINQ, considerar este método de extensión ayudante:
public static dynamic With(this ExpandoObject o, Action<dynamic> init)
{
init(o);
return o;
}
Ahora puede utilizar así:
from x in xs
select new ExpandoObject().With(o => {
o.Foo = x;
o.Bar = (Func<int, int>)delegate(int y) { return x + y; };
});
¿Quieres decir la generación de código runtieme? ¿O te refieres a agregar métodos dinámicamente a los objetos, a la JavaScript? –
El más tarde. Parece que puedes hacerlo con árboles de expresión, pero qué PITA. – Trent