W świetle zaktualizowanego odpowiedź, nie jesteś rzeczywiście patrząc na „metod dynamicznych”, tak bardzo jak „dynamicznych obiektów” - takie, które można dodawać nowe właściwości i metody do nich w czasie wykonywania. Jeśli to prawda, to w .NET 4.0, można użyć ExpandoObject
w połączeniu z 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
Można mieć „metod dynamicznych”, która za pomocą wyrażenia drzew, a po uzyskaniu delegata dla takiego sposobu można również utworzyć z niego metodę wywoływania podobną do metody na ExpandoObject
.
Do użytku w kwerendach LINQ niestety nie można używać inicjalizatorów obiektów z ExpandoObject
; w najprostszym przypadku, dodaje się nie skompiluje:
var foo = new ExpandoObject { Bar = 123; }
Powodem jest to, że Bar
w tym przypadku będzie spojrzał statycznie jako własność ExpandoObject
. Aby ta funkcja mogła zostać wciągnięta, potrzebny jest odbiornik dynamic
i nie ma możliwości, aby została wykonana wewnątrz inicjalizatora obiektu. Jako obejście do użytku w LINQ, należy rozważyć tę metodę pomocnika rozszerzeń:
public static dynamic With(this ExpandoObject o, Action<dynamic> init)
{
init(o);
return o;
}
Teraz można go używać w następujący sposób:
from x in xs
select new ExpandoObject().With(o => {
o.Foo = x;
o.Bar = (Func<int, int>)delegate(int y) { return x + y; };
});
masz na myśli runtieme generowanie kodu? Czy chodzi ci o dynamiczne dodawanie metod do obiektów, a la JavaScript? –
The later. Wygląda na to, że możesz to zrobić z drzewkami ekspresji, ale co to jest PITA. – Trent