Estou tentando usar métodos de extensão para adicionar uma sobrecarga de operador à StringBuilder
classe C # . Especificamente, StringBuilder
sb
eu gostaria de sb += "text"
me tornar equivalente a sb.Append("text")
.
Aqui está a sintaxe para criar um método de extensão para StringBuilder
:
public static class sbExtensions
{
public static StringBuilder blah(this StringBuilder sb)
{
return sb;
}
}
Ele adiciona com êxito o blah
método de extensão ao arquivo StringBuilder
.
Infelizmente, a sobrecarga do operador não parece funcionar:
public static class sbExtensions
{
public static StringBuilder operator +(this StringBuilder sb, string s)
{
return sb.Append(s);
}
}
Entre outros problemas, a palavra this
- chave não é permitida neste contexto.
É possível adicionar sobrecargas do operador por meio de métodos de extensão? Se sim, qual é a maneira correta de fazer isso?
c#
extension-methods
operator-overloading
Jude Allred
fonte
fonte
Respostas:
No momento, isso não é possível, porque os métodos de extensão devem estar em classes estáticas e as classes estáticas não podem ter sobrecargas de operador.
Mads Torgersen, C # Language PM diz:
Editar:
Acabei de notar que Mads escreveu mais no mesmo artigo :
Atualmente, esse recurso está na tabela (potencialmente) para C # 8.0. Mads fala um pouco mais sobre como implementá-lo aqui .
fonte
String
no PowerShellScriptBlock
.true.Xor(false)
então^
é o operador xor em c # #Se você controlar os locais onde deseja usar esse "operador de extensão" (o que você normalmente faz com os métodos de extensão), poderá fazer algo assim:
A
StringBuilderWrapper
classe declara um operador de conversão implícito de aStringBuilder
e declara o+
operador desejado . Dessa forma,StringBuilder
pode-se passar um paraReceiveImportantMessage
, que será convertido silenciosamente em umStringBuilderWrapper
, onde o+
operador pode ser usado.Para tornar esse fato mais transparente para os chamadores, você pode declarar
ReceiveImportantMessage
como tendo umStringBuilder
e apenas usar código como este:Ou, para usá-lo inline onde você já está usando a
StringBuilder
, você pode simplesmente fazer o seguinte:Eu criei um post sobre o uso de uma abordagem semelhante para tornar
IComparable
mais compreensível.fonte
StringBuilderWrapper
que torna isso possível.StringBuilder
tipo e forneça um operador de conversão implícito. Depois disso, ele pode ser usado com literais de string, como demonstrado no exemplo:sb += "Hello World!";
String
:PushIndent(" ".X(4))
(também poderia ser chamadoTimes
). Ou talvez usando esse construtor:PushIndent(new String(' ', 4))
.Parece que isso não é possível no momento - há um problema de feedback aberto solicitando esse mesmo recurso no Microsoft Connect:
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=168224
sugerindo que ele pode aparecer em uma versão futura, mas não está implementado para a versão atual.
fonte
Embora não seja possível executar os operadores, você sempre pode criar os métodos Adicionar (ou Concat), Subtrair e Comparar ....
fonte
Hah! Eu estava procurando "operador de extensão sobrecarregando" com exatamente o mesmo desejo, por sb + = (coisa).
Depois de ler as respostas aqui (e ver que a resposta é "não"), para minhas necessidades específicas, fui com um método de extensão que combina sb.AppendLine e sb.AppendFormat e parece mais organizado do que qualquer um.
E entao,
Não é uma resposta geral, mas pode ser de interesse para futuros candidatos que analisam esse tipo de coisa.
fonte
AppendLine
vez deLine
.É possível equipá-lo com um invólucro e extensões, mas impossível fazê-lo corretamente. Você termina com o lixo que derrota totalmente o objetivo. Eu tenho um post aqui em algum lugar que faz isso, mas é inútil.
Btw Todas as conversões numéricas criam lixo no construtor de strings que precisa ser corrigido. Eu tive que escrever um invólucro para o que funciona e eu o uso. Vale a pena ler isso.
fonte