Lo que quiere se llama open instance delegate. No se admite directamente en el lenguaje C#, pero CLR lo admite.
Básicamente, un delegado de instancia abierto es lo mismo que un delegado normal, pero toma un parámetro adicional para this
antes de los parámetros normales, y tiene un objetivo nulo (como un delegado para un método estático). Por ejemplo, la instancia equivalente abierta de Action<T>
sería:
delegate void OpenAction<TThis, T>(TThis @this, T arg);
Aquí está un ejemplo completo:
void Main()
{
MethodInfo sayHelloMethod = typeof(Person).GetMethod("SayHello");
OpenAction<Person, string> action =
(OpenAction<Person, string>)
Delegate.CreateDelegate(
typeof(OpenAction<Person, string>),
null,
sayHelloMethod);
Person joe = new Person { Name = "Joe" };
action(joe, "Jack"); // Prints "Hello Jack, my name is Joe"
}
delegate void OpenAction<TThis, T>(TThis @this, T arg);
class Person
{
public string Name { get; set; }
public void SayHello(string name)
{
Console.WriteLine ("Hi {0}, my name is {1}", name, this.Name);
}
}
Tenga una mirada en this article para más detalles.
podría reformular la pregunta con algo más de detalles, creo que lo tengo en parte, pero no Por supuesto. –
Agregué un ejemplo de lo que quiero decir. Básicamente, ¿es posible tener un delegado sin una referencia de objeto y darle un objeto cuando lo llames? – Will
Cambié el título de su pregunta para hacerlo más claro. Siéntase libre de retroceder si no le gusta;) –