Tengo problemas para obtener el compilador de C# para llamar a un método de extensión que he creado, ya que prefiere un método de instancia con un argumento params
en su lugar.¿Cómo forzar el uso del método de extensión en lugar del método de instancia con params?
Por ejemplo, decir que tengo la siguiente clase y su método:
public class C
{
public void Trace(string format, params object[] args)
{
Console.WriteLine("Called instance method.");
}
}
Y y extensión:
public static class CExtensions
{
public void Trace(this C @this, string category, string message, params Tuple<string, decimal>[] indicators)
{
Console.WriteLine("Called extension method.");
}
}
En mi programa de ejemplo:
pubic void Main()
{
var c = new C();
c.Trace("Message");
c.Trace("Message: {0}", "foo");
c.Trace("Category", "Message", new KeyValuePair<string, decimal>("key", 123));
}
Todas las llamadas de impresión Called instance method.
.
No tengo acceso a la clase C
, obviamente, o no me molestaría en crear métodos de extensión, y mi extensión es importante porque permitiría a mis usuarios continuar utilizando una clase que ya conocen con algún valor agregado.
Por lo que he entendido, el compilador favorecerá los métodos de instancia sobre los métodos de extensión, pero ¿es esta la única regla? Eso significaría que cualquier clase con un método que se parece a Method(string format, params object[] args)
no puede tener métodos de extensión con un primer parámetro del tipo string
.
Cualquier explicación sobre las razones de este comportamiento o una forma de evitarlo (es decir, no "simplemente llame al CExtensions.Trace(c, "Category", ...
") sería muy apreciado.
Me he encontrado con esto antes. Parece que la única solución es cambiar el nombre del método. Me interesaría ver si hay una solución. – Polynomial