Zróbmy listę odpowiedzi, w której zamieścisz swoje doskonałe i ulubione metody rozszerzenia .
Wymagane jest opublikowanie pełnego kodu oraz przykładu i wyjaśnienia, jak go używać.
W związku z dużym zainteresowaniem tym tematem skonfigurowałem projekt Open Source o nazwie Extensionoverflow na Codeplex .
Proszę zaznaczyć swoje odpowiedzi akceptacją umieszczenia kodu w projekcie Codeplex.
Proszę zamieścić pełny kod źródłowy, a nie link.
Wiadomości Codeplex:
24.08.2010 Strona Codeplex jest już tutaj: http://extensionoverflow.codeplex.com/
11.11.2008 XmlSerialize / XmlDeserialize jest teraz zaimplementowany i przetestowany jednostkowo .
11.11.2008 Jest jeszcze miejsce dla większej liczby programistów. ;-) Dołącz TERAZ!
11.11.2008 Trzeci współtwórca dołączył do ExtensionOverflow , witamy w BKristensen
11.11.2008 FormatWith jest teraz zaimplementowany i przetestowany jednostkowo .
09.11.2008 Drugi współtwórca dołączył ExtensionOverflow . witamy w czakrycie .
09.11.2008 Potrzebujemy więcej programistów. ;-)
09.11.2008 ThrowIfArgumentIsNull jest już zaimplementowany i przetestowany w Codeplex.
źródło
Odpowiedzi:
Pozwala mi wymienić:
Z:
źródło
In
, ale możeIsIn
byłoby lepiej.In<T>(...)
tym i uznałem, że jest to najbardziej użyteczna metoda rozszerzenia poza standardową biblioteką. Ale nie zgadzam się z tym imieniemIn
. Nazwa metody powinna opisywać, co robi, aleIn
tego nie robi. Nazwałem toIsAnyOf<T>(...)
, ale myślę, żeIsIn<T>(...)
byłoby to również odpowiednie.Mam różne metody rozszerzenia w moim projekcie MiscUtil (dostępne jest tam pełne źródło - nie zamierzam go tutaj powtarzać). Moje ulubione, z których niektóre obejmują inne klasy (takie jak zakresy):
Data i godzina - głównie do testów jednostkowych. Nie jestem pewien, czy użyję ich w produkcji :)
Zakresy i wchodzenie - ogromne dzięki Marcowi Gravellowi za rzeczy operatora, aby było to możliwe:
Porównania:
Sprawdzanie argumentów:
LINQ to XML zastosowane do typów anonimowych (lub innych typów o odpowiednich właściwościach):
Wciśnij LINQ - wyjaśnienie tutaj zajęłoby zbyt dużo czasu, ale poszukaj go.
źródło
string.Format skrót:
Przykład:
Aby szybko skopiować i wkleić, przejdź tutaj .
Czy nie uważasz, że bardziej naturalne jest pisanie
"some string".F("param")
zamiaststring.Format("some string", "param")
?Aby uzyskać bardziej czytelną nazwę, wypróbuj jedną z następujących sugestii:
..
źródło
Czy to jakiś użytek?
źródło
OneOf
powinienem zaakceptować każdyIList<T>
. Wtedy zawsze można też mieć przeciążenie, że trwaparams
Arg i właśnie przechodzi że doIList<T>
przeciążenia. Odpowiedziałem (teraz na dole u dołu)NextBool
metodą podobną do twojejCoinToss
, ale z przeciążeniem, które przyjmujeprobability
parametr (co jeśli chcę, żeby coś się wydarzyło 75% czasu?). Ponadto, wystarczy wybrać nit: twój przykładowy kod wyrzuci,NullReferenceException
ponieważrand
nigdy nie jest inicjowany.CoinToss
być zaimplementowany,rng.NextDouble() < .5
ponieważ.Next(int)
jest wewnętrznie wykonany.NextDouble()
, abyś mógł zapisać rzut, * i czek.Przykład:
źródło
Metoda rozszerzenia:
Metoda ma zastosowanie do wszystkich typów i pozwala dodawać zakres elementów do listy jako parametry.
Przykład:
źródło
var list = new List<int>{5,4,8,4,2};
ICollection<T>
; wtedy można go również wykorzystać na przykład,LinkedList<T>
aHashSet<T>
nie tylko w indeksowanych kolekcjach.Jak najbardziej, umieść to w projekcie codeplex.
Serializacja / deserializacja obiektów do XML:
źródło
ToXml()
(jakToString()
)ForEach dla IEnumerables
Naiwny przykład:
Fajny przykład:
Uwaga:
To nie jest tak,
Select
ponieważ sięSelect
spodziewa że funkcja zwróci coś, jak w przypadku przekształcenia w inną listę.ForEach pozwala po prostu wykonać coś dla każdego elementu bez żadnych transformacji / manipulacji danymi.
Zrobiłem to, aby móc programować w bardziej funkcjonalnym stylu i byłem zaskoczony, że List ma ForEach, podczas gdy IEnumerable nie.
Umieść to w projekcie codeplex
źródło
Moje rozszerzenia konwersji, które pozwalają:
Oto, jak opublikowano na TheSoftwareJedi.com
Możesz poprosić o wartość domyślną (wywołuje pusty konstruktor lub „0” dla liczb) w przypadku niepowodzenia, możesz podać wartość „domyślną” (nazywam to „inną”) lub poprosić o wartość null (gdzie T: klasa). Podałem również oba ciche modele wyjątków oraz typowy model TryParse, który zwraca wartość bool wskazującą na podjęte działanie, a parametr wyjściowy zawiera nową wartość. Więc nasz kod może robić takie rzeczy
Nie mogłem zmusić typów Nullable do bardzo czystego wtoczenia się w całość. Próbowałem przez około 20 minut, zanim rzuciłem ręcznik.
źródło
ToOrNull
ma dokładnie takie samo zachowanie jakToOrDefault
(tzn. Jeśli wywołaszToOrDefault
typ referencyjny z nieudaną konwersją, zwrócinull
). Ale co ważniejsze, wydaje mi się to trochę zbędne, ponieważvar s = myObject as string
osiąga to samo, covar s = myObject.ToOrNull<string>()
- ale bez potencjalnej konieczności złapaniaInvalidCastException
. Czy coś brakuje?Mam metodę rozszerzenia do rejestrowania wyjątków:
I jest używany w następujący sposób:
[przepraszam, że wysłałem dwa razy; drugi jest lepiej zaprojektowany :-)]
źródło
Przydatne do parsowania łańcucha w Enum.
Zasługa Scott Dorman
--- Edycja dla projektu Codeplex ---
Zapytałem Scotta Dormana, czy miałby coś przeciwko, abyśmy opublikowali jego kod w projekcie Codeplex. Oto odpowiedź, którą od niego otrzymałem:
źródło
Uważam to za bardzo przydatne:
Możesz używać go w CodePlex.
źródło
DateTimeExtensions
Przykłady:
źródło
gitorious.org/cadenza to pełna biblioteka jednych z najbardziej użytecznych metod rozszerzenia, jakie widziałem.
źródło
Oto jeden, którego często używam do formatowania prezentacji.
źródło
Oto cyfry rzymskie. Nie jest często używany, ale może być przydatny. Stosowanie:
Źródło:
źródło
Wygodny sposób radzenia sobie z rozmiarami:
źródło
W przypadku formantów Winform:
Wykorzystanie IsDesignTime:
Zastosowanie SetDropdownWidth:
Zapomniałem wspomnieć, możesz użyć ich na Codeplex ...
źródło
ThrowIfArgumentIsNull to dobry sposób na wykonanie kontroli zerowej, którą wszyscy powinniśmy zrobić.
Poniżej znajduje się sposób korzystania z niego i działa on na wszystkich klasach w Twojej przestrzeni nazw lub wszędzie tam, gdzie używasz przestrzeni nazw.
Można używać tego kodu w projekcie CodePlex .
źródło
default(T)
tego i usunęł wymagania klasowe.Require.ThatArgument(input != null)
lubRequire.ThatArgument(personId > 0)
. Nie wymaga dużo więcej kodu, jest o wiele bardziej elastyczny i ładnie czyta. Mam dodatkowe przesłonięcia, które uwzględniają funkcje, gdy chcesz dostosować komunikat o błędzie lub sam wyjątek.Tęsknię za instrukcją With w języku Visual Basic przy przejściu do C #, więc oto:
A oto jak używać go w C #:
Oszczędza dużo pisania!
Porównaj to z:
umieścić w projekcie codeplex
źródło
Pobiera camelCaseWord lub PascalCaseWord i „formułuje” go, tzn. CamelCaseWord => Słowo wielbłąda
Często używam go w połączeniu z Capitalize
Przykładowe użycie
Bezpłatnie korzystać z projektu codeplex
źródło
Uznałem to za pomocne
Usuwa zaznaczenie zerowe w kodzie wywołującym. Możesz teraz zrobić
źródło
Konwertuj podwójne na ciągi sformatowane przy użyciu określonej kultury:
Przykład:
źródło
Poniżej znajduje się metoda rozszerzenia, która dostosowuje kod Ricka Strahla (i także komentarze), aby nie trzeba było zgadywać lub czytać znaku kolejności bajtów tablicy bajtów lub pliku tekstowego za każdym razem, gdy konwertujesz go na ciąg.
Fragment pozwala po prostu wykonać:
Jeśli znajdziesz jakieś błędy, dodaj je do komentarzy. Dołącz go do projektu Codeplex.
źródło
Oto jeden, który właśnie stworzyłem dzisiaj.
Pozwala ci to zrobić:
który jest bardziej płynny i (IMO) łatwiejszy do odczytania niż to:
źródło
thingy.NullOr(t => t.Count)
, gdzieCount
jest int? Powinieneś powrócićdefault(TReturn)
zamiast zerowego, w ten sposób nie będziesz potrzebowaćclass
ograniczenia i będzie ono działać również dla typów wartościTReturn elseValue = default(TReturn)
jest dostępny tylko dla .NET 4.0? Mam 3.5 SP1 i nigdy nie widziałem tej konstrukcji (nie ma też mojego kompilatora). Właśnie przeniosłem to do metody. Jednym z problemów jest jednak to, że umieszczenie w polu obiektu typu zerowalnego do obiektu w celu użycia z metodą daje nieoczekiwany wynik (0 w porównaniu z oczekiwanym zerowym).default(T)
słowo kluczowe istnieje od VS2005, ale myślę, że domyślne parametry to nowa funkcja .NET 4. Łatwym rozwiązaniem powinno być posiadanie dwóch wariantów, jednego, który bierze param, a drugiego, który nie. Zaktualizuję odpowiedź, aby była zgodna z CLR 2.0. Jeśli chodzi o boks - o to właśnie chodzidefault
. Będą to dane inicjowane na 0 dla typu wartości, a null dla wszystkich typów referencji. TReturn typu wartości powinien pozostać rozpakowany przez całą funkcję.x.Value
powinno zwracać null (jeśli na przykładint?
był null) lub wartość, jeśliint?
ma wartość. Zwracanie0
point? x = null
przekazaniu i zapakowaniu do obiektu jest przypadkiem dziwnym. Widziałem podobne kontrole typów zerowalnych w bibliotekach, takich jak płynne nhibernate i linfu (tak myślę) w tym konkretnym przypadku, co pozwala na usunięcie ograniczenia klasy, jak wcześniej sugerowano.„Proszę zaznaczyć swoje odpowiedzi akceptacją, aby umieścić kod w projekcie Codeplex.”
Dlaczego? Wszystkie rzeczy na tej stronie pod CC-by-sa-2.5 , więc po prostu umieść swój projekt przepełnienia rozszerzenia na tej samej licencji i możesz go swobodnie używać.
Tak czy inaczej, tutaj jest funkcja String.Reverse, oparta na tym pytaniu .
źródło
Mam dość żmudnego sprawdzania wartości zerowej podczas pobierania wartości z MySqlDataReader, więc:
Oczywiście można tego użyć z dowolnym SqlDataReader.
Zarówno hangy, jak i Joe mieli dobre komentarze na temat tego, jak to zrobić, i od tego czasu miałem okazję zaimplementować coś podobnego w innym kontekście, więc oto inna wersja:
źródło
as
słowa kluczowego, aby uzyskać wartość z czytnika, która pozwala na wartość null. Jeśli połączysz zerowy??
operator koalescencyjny z operatorem as, możesz nawet mieć inną niż zerową wartość domyślną, aby przejść bezpośrednio do typu wartości. Zobacz stackoverflow.com/questions/746767/…Zirytowało mnie, że LINQ daje mi OrderBy, który przyjmuje klasę implementującą IComparer jako argument, ale nie obsługuje przekazywania prostej anonimowej funkcji porównującej. Naprawiłem to.
Ta klasa tworzy IComparer z funkcji porównywania ...
... a te metody rozszerzeń ujawniają moje nowe przeciążenia OrderBy dla elementów wyliczeniowych. Wątpię, czy to działa w przypadku LINQ na SQL, ale świetnie nadaje się do LINQ na Objects.
Jeśli chcesz, możesz umieścić to w codeplex.
źródło
Ten jest dla MVC, dodaje możliwość generowania
<label />
znacznika doHtml
zmiennej, która jest dostępna w każdymViewPage
. Mamy nadzieję, że przyda się innym próbującym opracować podobne rozszerzenia.Posługiwać się:
Wynik:
Kod:
źródło
Włącz to:
... zaangażowany w to:
... używając tej metody rozszerzenia:
Więcej metod rozszerzenia ADO.NET: DbExtensions
źródło