Vamos fazer uma lista de respostas onde você publica seus métodos de extensão excelentes e favoritos .
O requisito é que o código completo seja publicado e um exemplo e uma explicação sobre como usá-lo.
Com base no grande interesse neste tópico, configurei um projeto de código aberto chamado extensionoverflow no Codeplex .
Marque suas respostas com uma aceitação para inserir o código no projeto Codeplex.
Poste o código fonte completo e não um link.
Notícias Codeplex:
24.08.2010 A página Codeplex agora está aqui: http://extensionoverflow.codeplex.com/
11.11.2008 XmlSerialize / XmlDeserialize agora está implementado e testado por unidade .
11.11.2008 Ainda há espaço para mais desenvolvedores. ;-) Inscreva-se agora!
11.11.2008 Terceiro colaborador ingressou no ExtensionOverflow , bem-vindo ao BKristensen
11.11.2008 FormatWith agora está implementado e testado por unidade .
09.11.2008 O segundo colaborador ingressou no ExtensionOverflow . bem-vindo ao chakrit .
09.11.2008 Precisamos de mais desenvolvedores. ;-)
09.11.2008 ThrowIfArgumentIsNull agora implementado e testado por unidade no Codeplex.
fonte
Respostas:
Permite substituir:
Com:
fonte
In
, mas talvezIsIn
seja melhor.In<T>(...)
também e achei o método de extensão mais útil fora da biblioteca padrão. Mas estou em desacordo com o nomeIn
. Um nome de método deve estar descrevendo o que faz, masIn
não o faz. Eu chameiIsAnyOf<T>(...)
, mas achoIsIn<T>(...)
que seria adequado também.Eu tenho vários métodos de extensão no meu projeto MiscUtil (a fonte completa está disponível lá - não vou repeti-lo aqui). Meus favoritos, alguns dos quais envolvem outras classes (como intervalos):
Data e hora - principalmente para testes de unidade. Não tenho certeza se os usaria na produção :)
Intervalos e passos - um enorme agradecimento a Marc Gravell pelo material do operador para tornar isso possível:
Comparações:
Verificação de argumento:
LINQ to XML aplicado a tipos anônimos (ou outros tipos com propriedades apropriadas):
Pressione LINQ - levaria muito tempo para explicar aqui, mas procure-o.
fonte
string.Format:
Exemplo:
Para copiar e colar rapidamente, clique aqui .
Você não acha mais natural digitar em
"some string".F("param")
vez destring.Format("some string", "param")
?Para um nome mais legível , tente uma destas sugestões:
..
fonte
Estes são de alguma utilidade?
fonte
OneOf
aceite qualquerIList<T>
. Então você sempre pode também ter uma sobrecarga que recebe umparams
argumento e apenas passa isso para aIList<T>
sobrecarga. Eu dei uma resposta (bem na parte inferior agora) com umNextBool
método semelhante ao seuCoinToss
, mas com uma sobrecarga que requer umprobability
parâmetro (e se eu quiser que algo aconteça 75% do tempo?). Além disso, apenas uma escolha de nit: o seu código de exemplo emitirá umNullReferenceException
dado querand
nunca é inicializado.CoinToss
ser implementadorng.NextDouble() < .5
porque.Next(int)
é feito internamente com,.NextDouble()
para que você salve um elenco, um * e um cheque.Exemplo:
fonte
O método de extensão:
O método se aplica a todos os tipos e permite adicionar um intervalo de itens a uma lista como parâmetros.
Exemplo:
fonte
var list = new List<int>{5,4,8,4,2};
ICollection<T>
; também poderia ser usado em, por exemplo,LinkedList<T>
eHashSet<T>
não apenas em coleções indexadas.Por todos os meios, coloque isso no projeto codeplex.
Serializando / desserializando objetos para XML:
fonte
ToXml()
(comoToString()
)ForEach for IEnumerables
Exemplo ingênuo:
Exemplo legal:
Nota:
Não é assim,
Select
porqueSelect
espera que sua função retorne algo como para se transformar em outra lista.O ForEach simplesmente permite que você execute algo para cada um dos itens sem nenhuma transformação / manipulação de dados.
Fiz isso para que eu possa programar em um estilo mais funcional e fiquei surpreso que o List tenha um ForEach, enquanto o IEnumerable não.
Coloque isso no projeto codeplex
fonte
Minhas extensões de conversão que permitem:
Aqui está, conforme publicado em TheSoftwareJedi.com
Você pode solicitar o padrão (chama o construtor em branco ou "0" para números) em caso de falha, especificar um valor "padrão" (eu chamo de "outro") ou pedir nulo (onde T: classe). Também forneci modelos de exceção silenciosa e um modelo TryParse típico que retorna um bool indicando a ação executada e um parâmetro out mantém o novo valor. Portanto, nosso código pode fazer coisas assim
Eu não conseguia fazer com que os tipos Nullable entrassem na coisa toda de maneira muito limpa. Eu tentei por cerca de 20 minutos antes de jogar a toalha.
fonte
ToOrNull
tenha exatamente o mesmo comportamento queToOrDefault
(por exemplo, se você chamarToOrDefault
um tipo de referência com uma conversão malsucedida, ela retornaránull
). Mas o mais importante, parece meio redundante para mim, poisvar s = myObject as string
realiza a mesma coisa quevar s = myObject.ToOrNull<string>()
- mas sem potencialmente ter que pegar umInvalidCastException
. Estou esquecendo de algo?Eu tenho um método de extensão para registrar exceções:
E é usado assim:
[desculpe por postar duas vezes; o segundo é melhor projetado :-)]
fonte
Útil para analisar uma string em um Enum.
O crédito é para Scott Dorman
--- Editar para o projeto Codeplex ---
Perguntei a Scott Dorman se ele se importaria em publicar seu código no projeto Codeplex. Esta é a resposta que recebi dele:
fonte
Acho este bastante útil:
Você pode usá-lo no CodePlex.
fonte
DateTimeExtensions
Exemplos:
fonte
gitorious.org/cadenza é uma biblioteca completa de alguns dos métodos de extensão mais úteis que eu já vi.
fonte
Aqui está um que eu uso frequentemente para formatação de apresentações.
fonte
Aqui está uma lista de numeração romana. Não é usado com frequência, mas pode ser útil. Uso:
A fonte:
fonte
Uma maneira conveniente de lidar com tamanhos:
fonte
Para controles Winform:
Uso do IsDesignTime:
Uso de SetDropdownWidth:
Esqueci de mencionar, fique à vontade para usá-los no Codeplex ...
fonte
O ThrowIfArgumentIsNull é uma boa maneira de fazer essa verificação nula que todos nós devemos fazer.
Abaixo está a maneira de usá-lo e funciona em todas as classes no seu espaço para nome ou onde quer que você use o espaço dentro.
Não há problema em usar esse código no projeto CodePlex .
fonte
default(T)
isso e removeria o requisito de classe.Require.ThatArgument(input != null)
ouRequire.ThatArgument(personId > 0)
. Não é preciso muito mais código, é muito mais flexível e tem uma boa leitura. Tenho substituições adicionais que aceitam funcs para quando você deseja personalizar a mensagem de erro ou a própria exceção.Sinto falta da declaração With do Visual Basic ao mudar para C #, então aqui vai:
E aqui está como usá-lo em C #:
Economiza muita digitação!
Compare isso com:
colocar no projeto codeplex
fonte
Pega um camelCaseWord ou PascalCaseWord e o "wordifica", ou seja, camelCaseWord => camel Case Word
Costumo usá-lo em conjunto com Capitalize
Exemplo de uso
Livre para usar no projeto codeplex
fonte
Eu achei este útil
Ele remove a verificação nula no código de chamada. Agora você poderia fazer
fonte
Converta um dobro em string formatado usando a cultura especificada:
Exemplo:
fonte
Abaixo está um método de extensão que adapta o código de Rick Strahl (e os comentários também) para impedir que você precise adivinhar ou ler a marca de ordem de bytes de uma matriz de bytes ou arquivo de texto cada vez que você o converte em uma string.
O snippet permite que você faça:
Se você encontrar algum erro, por favor, adicione aos comentários. Sinta-se à vontade para incluí-lo no projeto Codeplex.
fonte
Aqui está um que eu acabei de criar hoje.
Permite fazer isso:
que é mais fluente e (IMO) mais fácil de ler do que isso:
fonte
thingy.NullOr(t => t.Count)
, ondeCount
está um int? Você deve retornardefault(TReturn)
ao invés de null, dessa forma você não vai precisar daclass
restrição e ele vai trabalhar para tipos de valor demasiadoTReturn elseValue = default(TReturn)
só está disponível para o .NET 4.0? Eu tenho o 3.5 SP1 e nunca vi essa construção (nem meu compilador). Acabei de mudar isso para dentro do método. Um problema, no entanto, é que o boxe de um tipo anulável para objetar para uso com o método gera um resultado inesperado (0 vs nulo esperado).default(T)
palavra-chave existe desde o VS2005, mas acho que os parâmetros padrão são um novo recurso do .NET 4. A maneira mais fácil de contornar isso deve ser ter duas variantes, uma que aceita o parâmetro e outra que não. Vou atualizar a resposta para ser compatível com CLR 2.0. Quanto ao boxe - esse é o pontodefault
. Serão dados inicializados com 0 para um tipo de valor e nulos para todos os tipos de referência. Um retorno de um tipo de valor deve permanecer unboxed por toda a função.x.Value
deve retornar nulo (se, por exemplo,int?
for nulo) ou o valor seint?
tiver um valor. Retornar0
quandoint? x = null
é passado e encaixotado ao objeto é um caso estranho. Eu já vi verificações semelhantes para tipos anuláveis em bibliotecas como nhibernate fluente e linfu (acho) para este caso específico, permitindo que você elimine a restrição de classe conforme sugerido anteriormente."Por favor, marque suas respostas com uma aceitação para colocar o código no projeto Codeplex."
Por quê? Todas as coisas neste site sob CC-by-sa-2.5 . Portanto, basta colocar seu Projeto de extensão de extensão sob a mesma licença e você pode usá-lo livremente.
De qualquer forma, aqui está uma função String.Reverse, com base nesta pergunta .
fonte
Eu cansei da verificação nula tediosa ao extrair valores do MySqlDataReader, então:
Obviamente, isso pode ser usado com qualquer SqlDataReader.
Hangy e Joe fizeram alguns bons comentários sobre como fazer isso, e desde então tive a oportunidade de implementar algo semelhante em um contexto diferente, então aqui está outra versão:
fonte
as
palavra-chave para obter um valor de um leitor que permita nulo. Se você combinar o??
operador coalescente nulo com o operador as, poderá até ter um valor padrão não nulo para ir diretamente para um tipo de valor. Veja stackoverflow.com/questions/746767/…Irritou-me o fato de o LINQ me fornecer um OrderBy que pega uma classe implementando IComparer como argumento, mas não suporta a passagem de uma simples função comparadora anônima. Eu retifiquei isso.
Esta classe cria um IComparer a partir da sua função comparadora ...
... e esses métodos de extensão expõem minhas novas sobrecargas OrderBy em enumerables. Duvido que isso funcione para o LINQ to SQL, mas é ótimo para o LINQ to Objects.
Você pode colocar isso no codeplex, se quiser.
fonte
Este é para o MVC, ele adiciona a capacidade de gerar um
<label />
tag para aHtml
variável que está disponível em todosViewPage
. Espero que seja útil para outras pessoas que tentam desenvolver extensões semelhantes.Usar:
Resultado:
Código:
fonte
Vire isto:
... nisso:
... usando este método de extensão:
Mais métodos de extensão do ADO.NET: DbExtensions
fonte