2017-03-25 3 views
0

ich eine Schnittstelle Klasse erstellt alle commun Methoden setzen dann ich von meinen anderen Klasse erben, aber ich mit einem Verfahren ein Problem zu finden bin ich verwenden, um die Attribute der Klasse überprüfenÜbergeben Sie die aktuelle Klasse Typ typeOf in einer Schnittstelle

public KeyValuePair<string, string> CheckForNonNullArguments() 
    { 

     System.Reflection.PropertyInfo[] properties = typeof(BaseBLL).GetProperties(); 
     foreach (System.Reflection.PropertyInfo property in properties) 
      if (property.GetValue(this, null) != null && (!property.GetValue(this, null).Equals("NULL") && !property.GetValue(this, null).ToString().Equals("0")) && !String.IsNullOrEmpty(property.GetValue(this, null).ToString())) 
       return new KeyValuePair<string, string>(property.Name.ToString(), property.GetValue(this, null).ToString()); 
     return new KeyValuePair<string, string>("", ""); 
     //if (property.GetValue(this, null) != null) GetName(() => property); ; 
    } 

„BaseBLL“ ist der Name der Interface-Klasse, und ich brauche es jedes Mal ändern i erben, ist es eine Möglichkeit, dies zu tun? Ich habe versucht, den Aktivator, aber es funktioniert nicht oder ich wusste nicht, wie man es benutzt.

Vielen Dank im Voraus.

+0

Pass einen 'Baumuster zur auf Ihre Methode und beim Aufruf 'CheckForNonNullArguments (typeof (BaseBLL))' wird die Arbeit machen –

+0

Vielen Dank (kann noch nicht stimmen ^^ „) – Angela

Antwort

3

So:

public KeyValuePair<string, string> CheckForNonNullArguments(Type @class) 
{ 

    System.Reflection.PropertyInfo[] properties = @class.GetProperties(); 
    foreach (System.Reflection.PropertyInfo property in properties) 
    { 
     object val = property.GetValue(this, null); // Caching result for better perfs. 
     string str = val?.ToString(); 
     if (val != null && (!str.Equals("NULL") && !str.Equals("0")) && !String.IsNullOrEmpty(str) 
      return new KeyValuePair<string, string>(property.Name.ToString(), str); 
    } 
    return new KeyValuePair<string, string>(string.Empty, string.Empty); 
    //if (property.GetValue(this, null) != null) GetName(() => property); ; 
} 

Genannt: CheckForNonNullArguments(typeof(BaseBLL))

Oder noch besser:

public KeyValuePair<string, string> CheckForNonNullArguments<T>() where T : class 
{ 

    System.Reflection.PropertyInfo[] properties = typeof(T).GetProperties(); 
    foreach (System.Reflection.PropertyInfo property in properties) 
    { 
     object val = property.GetValue(this, null); // Caching result for better perfs. 
     string str = val?.ToString(); 
     if (val != null && (!str.Equals("NULL") && !str.Equals("0")) && !String.IsNullOrEmpty(str) 
      return new KeyValuePair<string, string>(property.Name.ToString(), str); 
    } 
    return new KeyValuePair<string, string>(string.Empty, string.Empty); 
    //if (property.GetValue(this, null) != null) GetName(() => property); ; 
} 

Genannt: CheckForNonNullArguments<BaseBLL>()

+0

Noch besser ist vielen Dank: D gesendet ich Stunden damit ^^“ – Angela

+1

Beachten Sie, wie die Antwort der Rückgabewert von 'GetValue'-Caches; das ist wichtig. Die Reflexion ist langsam, besonders wenn sie immer wieder aufgerufen wird. Dies gilt für alles, was die gleiche Berechnung mehrmals durchführt (gleiche Eingänge, die gleichen Ausgänge erwarten) Sie würden nicht schreiben 'if (Hinzufügen (1,1)! = 3 && hinzufügen (1,1)! = 14 && hinzufügen (1,1)! = 25) {...} ', besonders wenn' Add() 'eine große Berechnung durchgeführt hat. 'int Ergebnis = Add (1,1); if (Ergebnis! = 3 && Ergebnis! = 14 && Ergebnis! = 25) {...} 'Siehst du den Unterschied? Abhängig davon, wie oft dies aufgerufen wird, kann es von Nutzen sein, die Reflexion in einem Delegierten zu cachen, aber das ist eine andere Frage. – pinkfloydx33

+2

Auch: Es gibt einen Fehler in der Antwort. In beiden Methoden ruft es vor dem Test "val.ToString()" auf, wenn "val" gleich "null" ist und würde eine NRE werfen. Ich würde es in 'string str = val ändern.?ToString(); (!! String.IsNullOrEmpty (str) && str.Equals ("NULL") && str.Equals ("0")), wenn return new KeyValuePair (property.Name, str); '(Note' IsNullOrEmpty' macht den Null-Test, braucht es nicht zweimal. Je nach Bedarf (und möglichen Eingaben) Sie 'string.IsNullOrWhitespace' statt prüfen möchten und möglicherweise Groß- und Kleinschreibung Optionen angeben, wenn Sie' Equals' gegen die Zeichenfolge „NULL“ – pinkfloydx33

Verwandte Themen