myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
   » Plugin für Firefox
   » Plugin für IE
   » Gadget für Windows
» Regeln
» Wie poste ich richtig?
» Datenschutzerklärung
» wbb-FAQ

Mitglieder
» Liste / Suche
» Stadt / Anleitung dazu
» Wer ist wo online?

Angebote
» ASP.NET Webspace
» Bücher
» Zeitschriften
   » dot.net magazin
» Accessoires

Ressourcen
» .NET-Glossar
» guide to C#
» openbook: Visual C#
» openbook: OO
» .NET BlogBook
» MSDN Webcasts
» Search.Net

Team
» Kontakt
» Übersicht
» Wir über uns
» Bankverbindung
» Impressum

» Unsere MiniCity
MiniCity
» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Gemeinschaft » .NET-Komponenten und C#-Snippets » InputValidator - Eingaben auf Typ prüfen
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

InputValidator - Eingaben auf Typ prüfen

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
inflames2k inflames2k ist männlich
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-3407.gif


Dabei seit: 03.01.2010
Beiträge: 1.653
Entwicklungsumgebung: Visual Studio 2010 Express


inflames2k ist offline

InputValidator - Eingaben auf Typ prüfen

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Beschreibung:

Im laufe der Zeit hat sich bei mir die statische Klasse InputValidator mit Methoden zur Prüfung von Eingaben angesammelt, die mir schon oft geholfen hat. Mit der Zeit kommen ab und an mal neue Methoden hinzu, und sie ist auch nicht gerade riesig.

Bis zum Zeitpunkt als ich begonnen habe mit der Klasse zu arbeiten, habe ich die Prüfungen immer wieder neu geschrieben, für jede Anwendung. Auch wenn der nutzen nur in Hinsicht der wiederverwendbarkeit liegt, möchte ich euch die Klasse nicht vorenthalten. Die Validierung eigener Typen habe ich entfernt. Somit bleibt eine überschaubare Menge an Typen übrig.

Update (18.11.2011): Die Klasse wurde von mir so geändert, dass die Validierungsmethode generisch ist, und eine Verwendung als Erweiterungsmethode möglich ist.

C#-Code:
    public static class InputValidator
    {
       /// <summary>
       /// Method to check if a string can be converted to a given type
       /// </summary>
       /// <typeparam name="T">the type</typeparam>
       /// <param name="input">the input</param>
       /// <returns>true if the string can be converted to the given type</returns>
       public static bool CanConvertTo<T>(this string input)
       {
           Object converted;
            try
            {
                 converted = Convert.ChangeType(input, typeof(T));
            }
            catch
            {
                 converted = null;
             }
          return converted != null;
       }
    }

Schlagwörter: Eingabevalidigierung, Typprüfung, Datentypen, input validation, InputValidator

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von inflames2k am 18.11.2011 19:06.

27.06.2011 15:07 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
JAck30lena JAck30lena ist männlich
myCSharp.de-Team (Admin)

images/avatars/avatar-2653.jpg


Dabei seit: 01.10.2006
Beiträge: 11.394
Entwicklungsumgebung: Visual Studio 05/08/10 Prof.


JAck30lena ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Die zuweisung des Defaultwertes solltest du weglassen, da bei einem "out" Parameter diese nicht notwendig ist, bzw. sowieso überschrieben wird.
27.06.2011 15:10 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
gfoidl gfoidl ist männlich
myCSharp.de-Team (Moderation)

images/avatars/avatar-2894.jpg


Dabei seit: 07.06.2009
Beiträge: 5.765
Entwicklungsumgebung: VS 2012 sup{Editionen}
Herkunft: Waidring / Tirol


gfoidl ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo inflames2k,

cool wäre das ganze noch als Erweiterungsmethoden - also überall ein this vor das String-Argument.


mfG Gü
27.06.2011 23:20 Beiträge des Benutzers | zu Buddylist hinzufügen
dispose
myCSharp.de-Mitglied

Dabei seit: 18.08.2009
Beiträge: 38
Entwicklungsumgebung: .NETCF 3.5


dispose ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

// Codeoptimierung an

Zitat:
C#-Code:
    /// <summary>
    /// Method to check if the input is Int32
    /// </summary>
    /// <param name="input">the input</param>
    /// <returns>true if the input is Int32</returns>
    public static bool IsInt32(string input)
    {
        Int32 value;
        return Int32.TryParse(input, out value);
    }

// Codeoptimierung aus

Zitat:
cool wäre das ganze noch als Erweiterungsmethoden - also überall ein this vor das String-Argument.

Oder man macht das ganze generisch und hat nur noch eine Methode.

C#-Code:
InputValidator.IsTypeOf<int>("123");

Grüße,

dispose

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von dispose am 04.07.2011 14:07.

04.07.2011 13:41 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
JAck30lena JAck30lena ist männlich
myCSharp.de-Team (Admin)

images/avatars/avatar-2653.jpg


Dabei seit: 01.10.2006
Beiträge: 11.394
Entwicklungsumgebung: Visual Studio 05/08/10 Prof.


JAck30lena ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat:
Oder man macht das ganze generisch und hat nur noch eine Funktion.

...Methode.


Noch besser:

C#-Code:
"123".CanParseTo<int>();
04.07.2011 13:58 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Cat
myCSharp.de-Mitglied

images/avatars/avatar-3070.jpg


Dabei seit: 25.10.2009
Beiträge: 534


Cat ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hi zusammen,

leider gibt es für TryParse kein Interface, um das ganze generisch zu machen (außer intern dann per Reflection auf die Methode zuzugreifen).
04.07.2011 14:34 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
JAck30lena JAck30lena ist männlich
myCSharp.de-Team (Admin)

images/avatars/avatar-2653.jpg


Dabei seit: 01.10.2006
Beiträge: 11.394
Entwicklungsumgebung: Visual Studio 05/08/10 Prof.


JAck30lena ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Interface wäre cool... aber ist hier ohnehin nicht notwendig.

C#-Code (ungetestet):
        public static bool CanParseTo<T>(this string input) where T:struct
        {
            string typeIdentifier = typeof (T).Name;
            switch(typeIdentifier)
            {
                case "Int32":
                    Int32 value;
                    return Int32.TryParse(input, out value);
                    // usw...
                default:
                    throw new NotSupportedException("The Type '" + typeIdentifier + "' is not supported.");
            }
        }
04.07.2011 14:48 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Cat
myCSharp.de-Mitglied

images/avatars/avatar-3070.jpg


Dabei seit: 25.10.2009
Beiträge: 534


Cat ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Aber irgendwie nicht meine Vorstellung von generisch verwundert
Dann doch lieber per Reflection, so daß man auch für eigene Datentypen einfach nur eine "TryParse"-Methode anbieten müßte.
04.07.2011 15:41 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Björn Björn ist männlich
myCSharp.de-Mitglied

Dabei seit: 03.10.2007
Beiträge: 139
Entwicklungsumgebung: VS 08 / 10 Pro.
Herkunft: Rhode


Björn ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ich habe bei mir noch folgenden Code-Schnippsel entdeckt, welcher hier passen würde:

C#-Code:
        public static T ConvertTo<T>(this object value)
        {
            if (value != null)
            {
                Type targetType = typeof(T);
                TypeConverter converter = TypeDescriptor.GetConverter(value);
                if (converter != null)
                {
                    if (converter.CanConvertTo(targetType))
                    {
                        return (T)converter.ConvertTo(null, CultureInfo.InvariantCulture, value, targetType);
                    }
                }
            }
            return null;
        }

Gruß
Björn
04.07.2011 16:08 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
myCSharp.de
Moderationshinweis von Abt (17.11.2011 14:25):

Ich möchte in den Code von Björn nicht eingreifen, aber ein return null ist hier aufgrund von T nicht möglich. Stattdessen müsste default(T) verwendet werden.
 
Zwischen diesen beiden Beiträgen liegen mehr als 4 Monate.
panicJonny
myCSharp.de-Mitglied

Dabei seit: 14.11.2011
Beiträge: 7


panicJonny ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

@Björn,

das funktioniert leider nicht so gut, da eine Lexikalische Konvertierung mit Typeconverter nicht geht.

Ich hätte das so:

C#-Code:
public static bool isType<T>(string value)
{
            // is everytime a string
            if (typeof(T) == typeof(string)) return true;

            // else try to find a TryParse of the output type            
            MethodInfo x = default(T).GetType().GetMethod("TryParse", new Type[]{typeof(string),typeof(T).MakeByRefType()});

            // if a TryParse found, return the result. Othwerwise return false
            if (x != null)
                return (bool)x.Invoke(new object(), new object[] { value, default(T) });
            else return false;
}

gelöst

Grüße,

PS: Verbesserungen sind gerne gesehen

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von panicJonny am 15.11.2011 13:26.

14.11.2011 14:34 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
inflames2k inflames2k ist männlich
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-3407.gif


Dabei seit: 03.01.2010
Beiträge: 1.653
Entwicklungsumgebung: Visual Studio 2010 Express

Themenstarter Thema begonnen von inflames2k

inflames2k ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

@panicJonny

Ist zwar schön kurz gehalten. Aber aus meiner Sicht ist Reflection hier ein Fall von mit Kanonen auf Spatzen geschossen.

Bis auf den Try-Catch gefällt mir eigentlich folgende Variante:

C#-Code:
/// <summary>
    /// Method to validate an input
    /// </summary>
    public static class InputValidator
    {
        /// <summary>
        /// Method to check if a string can be converted to a given type
        /// </summary>
        /// <typeparam name="T">the type</typeparam>
        /// <param name="input">the input</param>
        /// <returns>true if the string can be converted to the given type</returns>
        public static bool CanConvertTo<T>(this string input)
        {
            Object converted;
            try
            {
                converted = Convert.ChangeType(input, typeof(T));
            }
            catch
            {
                converted = null;
            }
            return converted != null;
        }
    }

Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von inflames2k am 17.11.2011 14:29.

17.11.2011 14:06 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
panicJonny
myCSharp.de-Mitglied

Dabei seit: 14.11.2011
Beiträge: 7


panicJonny ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Immerhin hab ich damit viele Spatzen getroffen :D

Ich geb an der Stelle auch einfach mal zu, dass das oben mein erster echter Versuch in Sachen Reflection war. Hat mir viel Spaß gemacht, das zu basteln und als ich gesehen habe, dass der Beitrag schon älter ist, wollte ich das eigentlich nicht posten.


Aber mal interessant zu sehen, wie du dich von deinem ersten Post weiterentwickelt hast ^^.


Grüße,
18.11.2011 13:17 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 3 Jahre.
Der letzte Beitrag ist älter als 2 Jahre.
Antwort erstellen


© Copyright 2003-2014 myCSharp.de-Team. Alle Rechte vorbehalten. 30.07.2014 19:09