2016-07-13 2 views
0

Я искал способ переместить элементы коллекции (я не определился с какой коллекцией) на Object[]. Я пытаюсь вызвать метод путем отражения с использованием параметра вызывающего метода (коллекции) в качестве параметров вызываемого метода.Преобразование коллекции в объект []

У меня есть пара (ОБНОВЛЕНИЕ) методов, которые я хочу получить через REST api, что в свою очередь требует разного количества параметров. Поэтому я решил использовать коллекцию в качестве одного из параметров, которые требуется REST api's Update. Но так как мне нужно вызвать метод из отражения, мне также нужно как-то разобрать/отбросить коллекцию до Object[].

Это то, что я прямо сейчас, и, как упоминалось я, кажется, немного застрял ...

Кроме того, имейте в виду, что это не вопрос о том, как настроить службу REST (как и мой другой), а просто как наилучшим образом отобразить коллекцию для правильных параметров вызова. Кроме того, будет с благодарностью оценена любая помощь или совет по использованию какой-либо коллекции.

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); 
} 

Вот два примера методов, которые я намерен призвать:

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

В чем вопрос и где ваша текущая проблема в размещенном коде? – Quantic

+0

О, подумал, что это очевидно. Я в основном бредил, посмотрев на тот же код в течение нескольких часов. В принципе, я не уверен, как вызвать метод с элементами в списке (параметрах) в качестве параметров вызываемого метода. – geostocker

+0

Также, спасибо за редактирование, сервис. :) – geostocker

ответ

1

Предполагая, что вам нужно object[], как для списка аргументов для Invoke - вызов ToArray на IEnumerable<object> это один вариант *:

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); 

* Примечание: Invoke требует типов элементов в массивах для соответствия типам параметров. Листинг до object не изменяет тип параметра. Если методы, которые нужно вызвать, принимают разные типы в качестве аргументов (т. Е. Не все string), чем вам нужно будет придерживаться передающих аргументов вашему помощнику в виде набора базовых типов всех возможных параметров. Скорее всего, вы получите коллекцию object элементов - например List<object> или просто избегайте всех преобразований и постройте object[].

Если ваши значения начинаются с нетипизированных строк (то есть ввода пользователя), вы можете использовать Convert.ChangeType вместо Cast, чтобы попытаться совместить типы параметров. ChangeType работает для преобразования строк в числовые типы, если вам нужны более сложные типы - используйте свою собственную логику преобразования.

+0

Приведет ли это отдельные элементы коллекции (список ) к объекту [] с элементами в них? Значение, если параметры были ["1", "2", "3"], тогда paramAsObjects были бы ["1", "2", "3"]? – geostocker

+0

@geostocker да.Обратите внимание, что приведение к объекту не изменяет тип параметров, поэтому вы не можете передавать 'string' как параметр' int'. –

+0

@Alexei: Итак ... ваш ответ верен на техническом уровне, но на функциональном уровне он полностью потерпит неудачу: он получит прекрасное исключение ... –

Смежные вопросы