2016-07-13 23 views
0

Ich habe nach einer Möglichkeit gesucht, die Elemente einer Sammlung (ich habe mich nicht entschieden, welche Art von Sammlung) zu einem Object[] verschieben. Ich versuche, eine Methode durch Reflektion aufzurufen, indem ich den Parameter der aufrufenden Methode (die Sammlung) als Parameter der aufgerufenen Methode verwende.Konvertieren einer Sammlung in ein Objekt []

Ich habe ein Paar (UPDATE) von Methoden, auf die ich über eine REST-API zugreifen möchte, die wiederum unterschiedliche Mengen an Parametern erfordert. Als solche habe ich mich entschieden, eine Sammlung als einen der Parameter zu verwenden, den die REST API Update erfordert. Aber da ich eine Methode aus der Reflektion aufrufen muss, muss ich die Sammlung auch irgendwie zu einer Object[] parsen/casten.

Das ist, was ich jetzt habe, und wie bereits erwähnt scheine ich ein bisschen stecken ...

auch sein, bitte beachten Sie, dass dies nicht eine Frage ist, wie der REST-Dienst einzurichten (wie meine andere), sondern einfach, wie man die Sammlung am besten auf die richtigen Aufrufparameter überträgt. Darüber hinaus wird jede Hilfe oder Beratung in Bezug auf die Art der Sammlung sehr geschätzt.

public void Update(String proc, List<String> parameters) 
{ 
    var myType = typeof(JaberoDC.JaberoDC.JaberoDC); 
    var list = parameters; 
    var method = myType 
     .GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly) 
     .Single(mi => string.Equals(mi.Name, proc, StringComparison.OrdinalIgnoreCase)); 
    var subject = Activator.CreateInstance(myType); 
    var result = method.Invoke(subject, list); 
} 

Hier sind zwei Beispiele von Methoden, die ich zu berufen beabsichtigen:

public bool UPDATEActivities(int? iID, int? iWorksiteID, string strActivityName, string strMethodOfWork, DateTime? dtPlannedStart, DateTime? dtActualStart, DateTime? dtPlannedFinish, DateTime? dtActualFinish, bool? blMileStoneFlag, bool? blActivityCutShort, int? iInterruptionMinutes, string strVarianceReason, string strConn, string strUserName); 

public bool UPDATEWorksiteEntry(int? iID, string strJobName, string strJobID, string strSiteName, int? iCalendarWeek, int? iMainContractor, string strJobStartFrom, string strJobEndAt, string strSACStaffAssigned, string strReferenceNumber, int? iTerritory, string strFunction, string strItemNumber, string strLine, int? iWorksiteType, string strUID, string strEventNumber, string strRestrictions, string strLatitude, string strLongitude, string strPlannedWork, int? iPlannedStartMileage, int? iPlannedFinishMileage, DateTime? dtPlannedStart, DateTime? dtActualstart, DateTime? dtPlannedFinish, DateTime? dtActualFinish, int? iActualFinishMileage, int? iActualFinishYardage, int? iActualStartMileage, int? iActualStartYardage, int? iPlannedFinishYardage, int? iPlannedStartYardage, string strSACDayPhoneNo, string strSACNightPhoneNo, string strELR, string strSacPoint, bool? blTunnelSignIn, string strConn, string strUserName); 
+0

Was ist die Frage und wo ist Ihr aktuelles Problem im gebuchten Code? – Quantic

+0

Oh, dachte es war offensichtlich. Ich bin im Grunde Delirium, nachdem ich den gleichen Code für ein paar Stunden angeschaut habe. Grundsätzlich bin ich nicht sicher, wie Sie die Methode mit den Elementen in der Liste (Parameter) als Parameter der aufgerufenen Methode aufrufen. – geostocker

+0

Danke auch für den Schnitt, Servy. :) – geostocker

Antwort

1

Sie object[] wie für die Liste der Argumente für Invoke müssen Angenommen - Aufruf ToArray auf IEnumerable<object> ist eine Option *:

List<string> parameters = new List<string>{"a","b"}; 
    var paramsAsObjects = parameters 
     .Cast<object>() // need to cast each item from string to object 
     .ToArray(); 

    methodWithTwoStringParam.Invoke(..., paramsAsObjects); 

* Hinweis: Invoke erfordert Typen von Elementen in Arrays, um Typen von Parametern zu entsprechen. Casting zu object ändert Art des Parameters nicht. Wenn Methoden, die Sie aufrufen müssen, verschiedene Typen als Argumente verwenden (d. H. Nicht alle string), müssen Sie die Übergabe von Argumenten an Ihren Helfer als Sammlung von Basistypen aller möglichen Parameter beibehalten. Höchstwahrscheinlich enden Sie mit Sammlung von object Elementen - wie List<object> oder vermeiden Sie einfach alle Umwandlungen und konstruieren Sie object[], um damit zu beginnen.

Wenn Ihre Werte von nicht typisierten Zeichenfolgen (d. H. Benutzereingaben) ausgehen, können Sie die Verwendung von Convert.ChangeType anstelle von Cast in Betracht ziehen, um zu versuchen, die Parametertypen abzugleichen. ChangeType funktioniert für die Konvertierung von Strings in numerische Typen, wenn Sie komplexere Typen benötigen - verwenden Sie Ihre eigene Konvertierungslogik.

+0

Würde dies die einzelnen Elemente der Sammlung (Liste Parameter) auf ein Objekt [] mit den Elementen in ihnen werfen? Bedeutet, wenn die Parameter ["1", "2", "3"] wären, dann wären paramAsObjects ["1", "2", "3"]? – geostocker

+0

@geostocker ja.Beachten Sie, dass das Umwandeln in ein Objekt den Typ der Parameter nicht ändert - Sie können also 'string' sowieso nicht als 'int'-Parameter übergeben. –

+0

@Alexei: Also ... Ihre Antwort ist auf technischer Ebene richtig, aber auf einer funktionalen Ebene wird es völlig fehlschlagen: Er wird eine schöne Ausnahme bekommen ... –