Frage

Wie kann ich diese Arbeit machen?

switch(property.PropertyType){
    case typeof(Boolean): 
        //doStuff
        break;
    case typeof(String): 
        //doOtherStuff
        break;
    default: break;
}

Ich will nicht den Namen verwenden, da String für Typen Vergleich nur awfull und unterliegen kann geändert werden.

War es hilfreich?

Lösung

        System.Type propertyType = typeof(Boolean);
        System.TypeCode typeCode = Type.GetTypeCode(propertyType);
        switch (typeCode)
        {
            case TypeCode.Boolean:
                //doStuff
                break;
            case TypeCode.String:
                //doOtherStuff
                break;
            default: break;
        }

Sie können einen hybriden Ansatz verwenden für TypeCode.Object wo Sie dynamisch, wenn mit typeof. Dies ist sehr schnell, weil für den ersten Teil - der Schalter -. Die Compiler auf einer Lookup-Tabelle basiert entscheiden können,

Andere Tipps

Sie können nicht. Was Sie tun können, ist eine Zuordnung zwischen Typen erstellen und Delegierter ein Wörterbuch mit:

var TypeMapping = new Dictionary<Type, Action<string>>(){
    {typeof(string), (x)=>Console.WriteLine("string")},
    {typeof(bool), (x)=>Console.WriteLine("bool")}
};



string s = "my string";

TypeMapping[s.GetType()]("foo");
TypeMapping[true.GetType()]("true");

Ich denke, was Sie suchen hier ist eine gute Karte. Mit Delegierten und eine generische IDictionary können Sie tun, was Sie wollen.

Versuchen Sie etwas wie folgt aus:

private delegate object MyDelegate();

private IDictionary<Type, MyDelegate> functionMap = new IDictionary<Type, MyDelegate>();

public Init()
{
  functionMap.Add(typeof(String), someFunction);
  functionMap.Add(tyepof(Boolean), someOtherFunction);
}

public T doStuff<T>(Type someType)
{
   return (T)functionMap[someType]();
}

Ich persönlich bevorzuge die Dictionary<Type, other> die meisten nähern ... Ich kann Ihnen noch ein anderes Beispiel liefern: http : //www.timvw.be/presenting-namevaluecollectionhelper/

Bei beharren Sie eine Switch-Case-Anweisung zum Schreiben Sie die Typnamen verwenden könnten ...

switch (blah.PropertyType.FullName)
{
   case typeof(int).FullName: break;
   case typeof(string).FullName: break;
}

C # 7.0 wird Schalter auf Typen als Teil größerer Pattern-Matching-Funktion unterstützen. Dieses Beispiel ist genommen von .NET Blog-Post , die neuen Features kündigt an:

switch(shape)
{
    case Circle c:
        WriteLine($"circle with radius {c.Radius}");
        break;
    case Rectangle s when (s.Length == s.Height):
        WriteLine($"{s.Length} x {s.Height} square");
        break;
    case Rectangle r:
        WriteLine($"{r.Length} x {r.Height} rectangle");
        break;
    default:
        WriteLine("<unknown shape>");
        break;
    case null:
        throw new ArgumentNullException(nameof(shape));
}

Kümmere dich nicht um Zeichenfolgen in einem Schalter verwenden, weil, wenn Sie der Compiler automatisch mehrere haben es in eine Hash-Lookup konvertieren geben ordentliche Leistung obwohl es ziemlich aweful suchen.

Das Problem des Typs Strings Ändern kann, indem es in einen expliziten Hash-Lookup selbst und bevölkern die constents des Hash in einem statischen Konstruktor gelöst werden. Auf diese Weise die Hash ist mit den richtigen Saiten zur Laufzeit füllen, so dass sie korrekt bleiben.

Sie können dies nicht mit dem Schalter in c # wie es der Fall konstant sein muss.

Was ist falsch an:

if(property.PropertyType == typeof(bool)) {
    //dostuff;
}
else if (property.PropertyType == typeof(string)) {
    //do other stuff;
}

Vor kurzem hatte ich etwas ähnliches und Schalter zu tun war keine Option. Doing eine == auf der typeof (x) ist in Ordnung, aber eine elegantere Möglichkeit könnte sein, so etwas zu tun:

if(property.PropertyType is bool){
  //dostuff;
}
else if (property.PropertyType is string){
    //do other stuff;
}

Aber, ich bin nicht sicher, dass Sie das verwenden können, „ist“ Schlüsselwort in dieser Art und Weise, ich denke, es funktioniert nur für Objekte ...

über den stringmatching: es war einer der reqs in der Frage es durch stringmatching nicht tun

.

Das Wörterbuch ist ein Ansatz, den ich verwenden, wenn ich in einer eigenen Bibliothek das gesamte Serialisierung Algorithmus setzen. Was jetzt werde ich den Typcode zunächst versuchen, wie mein Fall nur Grundtypen verwendet. Wenn das nicht funktioniert, werde ich den Schwarm zurück von if / Elses: S

Vor ppl mich fragen, warum ich meine eigene Serialisierung will: 1) .NET XML-Serialisierung serialisieren keine Eigenschaften ohne setters 2) Serialisierung hat auf einige Legacy-Regeln

einzuhalten

Sie einfach die normalen if / else if / else Muster:

if (property.PropertyType == typeof(Boolean))
{
} 
else if (property.PropertyType == typeof(String))
{
}
else if (...)
{
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top