2017-12-28 27 views
1

Ich habe eine Funktion wie folgt definiert:Kombination getPropertyName + mehr params-Funktion (Schlüsselwort params)

public static string GetPropertyName<T>(Expression<Func<T>> memberExpression) 
{ 
    MemberExpression expressionBody = (MemberExpression)memberExpression.Body; 
    return expressionBody.Member.Name; 
} 

Diese Funktion gibt den Namen des Parameters er empfängt.

getPropertyName (() => SomeParameter) -> Gibt die Zeichenfolge "SomeParameter"

Mein Problem dies mit mehreren Parametern Funktionen kombiniert.

Nehmen Sie diese Funktion:

public static string NameOfFirstEmptyParam(params string[] parameters) 
{ 
    foreach (string p in parameters) 
    { 
     if (String.IsNullOrWhiteSpace(p)) 
      return GetPropertyName<String>(() => p) 
    } 

    return null; 
} 

Wie Sie sich vorstellen können, wenn wir dies tun:

string param0 = "0"; 
string param1 = "1"; 
string param2 = null; 

NameOfFirstEmptyParam(param0, param1, param2); 

Die Funktion gibt "p".

Ich möchte stattdessen "Param2" bekommen. Irgendwelche Vorschläge oder Hinweise?

Vielen Dank.

+2

Die Syntax auszuführen, für 'params' ist kein Zufall/Zufall. Der aufrufende Code muss ein Array konstruieren und diesen als * single * -Parameter namens 'parameters' übergeben. Innerhalb von 'NameOfFirstEmptyParam' erhalten Sie nur diesen einen Parameter. Alle Namen, die zum Identifizieren von Variablen verwendet wurden, die als Teil des * Auffüllens * des Arrays verwendet wurden, das an Sie übergeben wurde, sind in keiner Weise "im Geltungsbereich" der 'NameOfFirstEmptyParam'-Methode. –

+2

Wie @Damien_The_Unbeliever erklärt, zur Laufzeit gibt es nirgends 'paramX', diese sind äquivalent zum Schreiben' NameOfFirstEmptyParam (new string [] {"0", "1", null}); '. – zaitsman

Antwort

2

Vielleicht könnten Sie etwas wie das

public static string NameOfFirstEmptyParam<T>(T parameters) where T: class 
    { 
     var propertyInfos = typeof(T).GetProperties(); 
     for (var i = 0; i < propertyInfos.Length; i++) 
     { 
      if (string.IsNullOrEmpty(propertyInfos[i].GetMethod.Invoke(parameters, null)?.ToString())) 
       return propertyInfos[i].Name; 
     } 
     return null; 
    } 

tun und

string param0 = "1"; 
string param1 = "2"; 
string param2 = null; 
NameOfFirstEmptyParam(new {param0, param1, param2}); //"param2" will be returned 
+0

es funktioniert wie ein Charme Vielen Dank: D – Lamelas84

+1

Gern geschehen :) .FYI Ich habe gerade jetzt die propertyInfos.Count() zu propertyInfos.Length geändert. – shawkyz1

Verwandte Themen