Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

C Sharp - Extensions

Anleitung Entwicklung C und C++

Mitglied: Blueberry

Blueberry (Level 1) - Jetzt verbinden

07.02.2012, aktualisiert 24.02.2012, 6581 Aufrufe, 2 Kommentare, 1 Danke

In dieser kleinen Anleitung, möchte ich zeigen, was Extensions sind und wie man sie unter C# einsetzt.
Beiläufig wird es noch Typen-Konvertierungen beinhalten, damit das auch mal geklärt ist.

Extension Method - Was ist das?
Mittels einer extension Method kann man einen Datentyp erweitern, d.h. wenn ich eine extension Method für den Datentyp String definiere, kann man darauf zugreifen, als ob man auf eine andere schon vorhandene bzw. schon in der String-Class implementierte Methode zugreift.

Bedingungen einer extension Method
Um eine extension Method zu schreiben, muss man lediglich ein paar Kleinigkeiten beachten:
    • Die Klasse in der die Methode geschrieben wird, muss statisch sein
    • Die Methode selbst muss auch statisch sein
    • Der erste Parameter muss vom entsprechenden Datentype sein und muss mit this versehen sein (siehe unter Implementierung)
    • Man braucht dazu mind. das .NET-Framework 3.5 (oder höher selbstverständlich)

Implementierung
Hier ein paar Beispiele

Unter dem Code gibt es noch eine Erklärung
01.
using System; 
02.
using System.IO; 
03.
using System.Text; 
04.
 
05.
namespace Basics 
06.
07.
    public static class Converter 
08.
09.
        /// <summary> 
10.
        /// Konvertiert einen String in einen Int32. 
11.
        /// </summary> 
12.
        /// <param name="str">Input-Parameter</param> 
13.
        /// <returns>In Int32 konvertierter String</returns> 
14.
        /// <exception cref="FormatException">Tritt auf, wenn der String nicht erlaubte zeichen beinhaltet</exception> 
15.
        /// <exception cref="OverflowException">Tritt auf, wenn die Zahl zu gross ist</exception> 
16.
        public static int ToInt32(this String str) 
17.
18.
            return Convert.ToInt32(str); 
19.
20.
 
21.
        /// <summary> 
22.
        /// Konvertiert einen String in einen Int32. 
23.
        /// Bei einer Exception wird die Default-Value zurückgegeben. 
24.
        /// </summary> 
25.
        /// <param name="str">Input-Parameter</param> 
26.
        /// <param name="defValue">Default-Value</param> 
27.
        /// <returns>In Int32 konvertierter String</returns> 
28.
        public static int ToInt32(this String str, Int32 defValue) 
29.
30.
            try 
31.
32.
                return ToInt32(str); 
33.
34.
            catch (Exception) 
35.
36.
                return defValue; 
37.
38.
39.
 
40.
        /// <summary> 
41.
        /// Konvertiert einen String in einen bool. 
42.
        /// </summary> 
43.
        /// <param name="str">Input-Parameter</param> 
44.
        /// <returns>Converted String bool</returns> 
45.
        public static bool ToBool(this String str) 
46.
47.
            switch(str.ToLower()) 
48.
49.
                case "1": 
50.
                case "true": 
51.
                case "yes": 
52.
                    return true; 
53.
                case "0": 
54.
                case "false": 
55.
                case "no": 
56.
                    return false; 
57.
                default: 
58.
                    throw new FormatException("Kann nicht konvertiert werden."); 
59.
60.
61.
62.
}
Hier sieht man den gesamten Aufbau, die statische Klasse, die statische Methoden und auch die mit dem this versehenen Parameter. Man sieht in der ToInt32-Überladung, dass man auch auf extension Methoden in einer Extension zugreifen kann. Dass ermöglicht einem, dass man auch bei extension Methoden nichts zwei Mal implementieren muss. Die ToBool-Methode finde ich vorallem sehr praktisch, da man diese ganz einfach erweitern kann. Man könnte z.B. auch eine CSV exportieren und dort diese für den Benutzer bereitstellen, so kann er selbst entscheiden, was true oder false ergeben soll.

Man kann auch Generics verwenden und die Extensions sind nicht nur auf die Basis-Typen anwendbar:
01.
        /// <summary> 
02.
        /// Konvertiert ein byte-Array in einen string 
03.
        /// </summary> 
04.
        /// <param name="arr">Input-Parameter</param> 
05.
        /// <returns>String welcher aus dem Byte-Array konvertiert wurde</returns> 
06.
        public static string GetString<T>(this byte[] arr) where T: Encoding, new() 
07.
08.
            return new T().GetString(arr); 
09.
10.
 
11.
        /// <summary> 
12.
        /// Liest einen Stream aus und gibt die Daten zurück. 
13.
        /// Seek-Unabhängige Methode. 
14.
        /// </summary> 
15.
        /// <param name="stream"></param> 
16.
        /// <param name="initSize"></param> 
17.
        /// <returns></returns> 
18.
        public static byte[] GetData(this Stream stream, int initSize) 
19.
20.
            if (stream == null) 
21.
                throw new ArgumentNullException("stream"); 
22.
 
23.
            //Überprüfen, ob man den Stream lesen kann. 
24.
            if (!stream.CanRead) 
25.
                throw new ArgumentException("Stream kann nicht gelesen werden!"); 
26.
 
27.
            if (initSize < 1) 
28.
                initSize = 128; 
29.
 
30.
            byte[] buffer = new byte[initSize]; 
31.
            int currByte, count = 0; 
32.
 
33.
            while((currByte = stream.ReadByte()) != -1) 
34.
35.
                buffer[count] = (byte)currByte; 
36.
                count++; 
37.
 
38.
                if(count == buffer.Length - 1) 
39.
40.
                    byte[] tmpBuffer = buffer; 
41.
                    buffer = new byte[tmpBuffer.Length * 2]; 
42.
                    tmpBuffer.CopyTo(buffer, 0); 
43.
44.
45.
             
46.
            Array.Resize(ref buffer, count); 
47.
 
48.
            return buffer; 
49.
50.
 
51.
        /// <summary> 
52.
        /// Konvertiert die Daten eines Streams in einen string mit dem angegebenen Encoding. 
53.
        /// </summary> 
54.
        /// <param name="stream">Input Stream</param> 
55.
        /// <returns>Gibt den stream in dem gewünschten Format zurück</returns> 
56.
        public static string GetStringData<T>(this Stream stream) where T : Encoding, new() 
57.
58.
            return stream.GetData().GetString<T>(); 
59.
        }
Mit solchen Extensions könnt ihr gut konvertierungen machen und müsst nicht mehr gross an die Typen-Konvertierung denken, wenn ihr am Arbeiten seid. Natürlich könnt ihr auch andere Funktionalitäten, welche nicht unbedingt eine Type-Konvertierung brauchen mittels Extensions implementieren, allerdings habe ich dafür noch nicht wirklich anwendung gefunden...

Edit: Habe jetzt auch schon eine Extension, welche nicht unbedingt eine Typen-Konvertierung beinhaltet.
Es geht dabei um eine Extension, welche tatsächlich neue Funktionalität zur Verfügung stellt. Die unten gezeigte Extension greift auf die User32.dll zu und ändert den Status der ProgressBar, damit man trotz aktiven Visual-Styles eine rote ProgressBar hinbekommt, ich konnte diese Methoden schon öfters gebrauchen.

01.
        #region Progressbar 
02.
 
03.
        #region Enum & Constants 
04.
        public enum ProgressBarState : int 
05.
06.
            NORMAL = 1, 
07.
            ERROR = 2, 
08.
            PAUSED = 3, 
09.
10.
 
11.
        public const int WM_USER = 0x400; 
12.
        public const int PBM_SETSTATE = WM_USER + 16; 
13.
        public const int PBM_GETSTATE = WM_USER + 17; 
14.
 
15.
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] 
16.
        static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); 
17.
         
18.
        #endregion 
19.
 
20.
        #region Methods 
21.
 
22.
        public static ProgressBarState GetState(this ProgressBar pBar) 
23.
24.
            return (ProgressBarState)(int)SendMessage(pBar.Handle, PBM_GETSTATE, IntPtr.Zero, IntPtr.Zero); 
25.
26.
 
27.
        public static void SetState(this ProgressBar pBar, ProgressBarState state) 
28.
29.
            SendMessage(pBar.Handle, PBM_SETSTATE, (IntPtr)state, IntPtr.Zero); 
30.
            //Die folgende Zeile sorgt dafür, dass alle Messages (z.B. die von oben) verarbeitet werden und erst dann weiter gemacht wird. 
31.
            Application.DoEvents(); 
32.
33.
 
34.
        #endregion 
35.
 
36.
        #endregion 
37.
 
Ich hoffe das Tut konnte euch etwas veranschaulichen, was eine Extension ist und wie man sie implementiert und anwendet.
Über Feedback und Kritik freue ich mich immer, allerdings ist es mein erstes Tut welches ich schreibe, seid also nicht zu hart zu mir .
Wenn ihr Verbesserungsvorschläge habt, dann sagt mir unbedingt bescheid!

Edit: Stream-Extension 'GetData' Seek-Unabhängig implementiert.
Mitglied: Herbrich19
20.02.2012, aktualisiert 21.02.2012
Kann ich zwar in Moment nicht wirklich gebrauchen, aber sehr schön übersichtlich. Ich werde unbedingt mal eine kleine Test-App schreiben und es mal testen, aber so kann man sich wirklich die Arbeit an den Konvertierungen sehr stark vereinfachen.

Grüße, Herbrich17
Bitte warten ..
Mitglied: Blueberry
22.02.2012 um 16:13 Uhr
Hallo Herbrich17

Vielen Dank für dein Feedback!
Ich habe mittlerweilen auch eine Extension geschrieben, welche nicht nur für Typen-Konvertierung geeignet ist, ich habe (bzw. werde) diese oben im Beitrag noch erweitern zum zeigen, dass man die Extensions auch für andere Sachen gebrauchen kann.

Gruss Blueberry
Bitte warten ..
Ähnliche Inhalte
C und C++
C-Sharp WPF Binding und Rechnen mit Element.With
Tipp von mayho33C und C++10 Kommentare

Hi @ All Eventuell geht es dem einen oder anderen ähnlich wie mir: WPF ist mächtig, hat aber seine ...

Samba
Samba und die Unix CIFS-Extensions
Erfahrungsbericht von toddi65Samba

Ich wollte mal was zu Samba loswerden, wovon vielleicht auch der eine oder andere Windows-Admin profitiert. Ich bin ebenfalls ...

PHP
Libsodium Extension als Alternative für entfernte Mcrypt Extension installieren (ab PHP 7.2)
Anleitung von FrankPHP2 Kommentare

Da die PHP Mcrypt Extension ab PHP 7.2 entfernt wird, suche ich schon einige Zeit lang eine gute und ...

PHP
PHP RFC: Mcrypt Extension wird ab PHP 7.2 entfernt
Information von FrankPHP

Ein RFC ist grob eine Abstimmung unter den PHP-Entwicklern, um neue, bestehende oder alte Feature hinzuzufügen, zu ändern, oder ...

Neue Wissensbeiträge
Erkennung und -Abwehr

Sicherheitslücke Spectre und Meltdown: Status prüfen

Anleitung von Frank vor 5 StundenErkennung und -Abwehr1 Kommentar

Nach all den Updates der letzten Woche sollte man unbedingt auch den Status prüfen, ob die Sicherheitslücke Spectre und ...

Microsoft Office

Office 2010 Starter erneut auf einer frischen Windows-Version installieren

Tipp von Lochkartenstanzer vor 1 TagMicrosoft Office9 Kommentare

Moin, vor ein paar Tagen schlug bei mir ein Kunde auf, der sein Widnows 7 geschrottet und es inklusive ...

Datenbanken

Upgrade MongoDB 3.4 auf 3.6

Erfahrungsbericht von Frank vor 1 TagDatenbanken

Seit kurzem gibt es das 3.6 Update für die MongoDB: Sicherheit, das Sortieren, Aggregation und auch die Performance wurde ...

SAN, NAS, DAS

Backdoor Zugang und Upload-Bug in vielen Western Digital MyCloud Geräten

Information von Frank vor 1 TagSAN, NAS, DAS2 Kommentare

James Bercegay von der Firma Gulftech hat die Fehler an Western Digital gemeldet und das Unternehmen stellt bereits ein ...

Heiß diskutierte Inhalte
Netzwerke
NTFS-Berechtigung
Frage von Daoudi1973Netzwerke23 Kommentare

Hallo zusammen und frohes neues Jahr (Sorry, ich bin spät dran) Meine Frage: 1- Ich habe einen Ordner im ...

Drucker und Scanner
Gesucht DIN A3 Drucker
Frage von NebellichtDrucker und Scanner15 Kommentare

Hallo, ich möchte einen neuen DIN A3 Drucker kaufen. Um ab und zu, ca. 1 mal die Woche Farbausdrucke ...

iOS
Einladung vom iphone kalender
Frage von jensgebkeniOS15 Kommentare

Hallo Gemeinschaft, folgendes Problem - immer wenn ich von meinem Iphone einen Termin einztrage und diesem Termin Teilnehmer zuweise, ...

Windows Netzwerk
Drucker isolieren in Windows Domäne
gelöst Frage von lcer00Windows Netzwerk14 Kommentare

Hallo zusammen, habe eine Windows-AD (2012R2) in der es einen Druckerserver gibt. Mittlerweile verliere ich das Vertrauen in die ...