2016-07-13 2 views
0

나는 컬렉션의 항목을 이동하는 방법을 찾고 있는데 (나는 어떤 종류의 컬렉션을 사용할지 결정하지 않았다) Object[]으로 이동했습니다. 호출 된 메서드의 매개 변수 (컬렉션)를 호출 된 메서드의 매개 변수로 사용하여 리플렉션을 통해 메서드를 호출하려고합니다.컬렉션을 개체로 변환 []

나는 여러 매개 변수를 필요로하는 REST API를 통해 액세스하려는 메소드 몇 (UPDATE)가 있습니다. 따라서 컬렉션을 REST API의 Update에 필요한 매개 변수 중 하나로 사용하기로 결정했습니다. 하지만 리플렉션에서 메서드를 호출해야하기 때문에 어떻게 든 컬렉션을 구문적으로/Object[] 컬렉션으로 캐스팅해야합니다.

이는 REST 서비스를 설정하는 방법에 대한 질문 (아니라는 것을 명심하시기 바랍니다 ... 내가 지금 가지고 있고, 언급 한 바와 같이 나는 조금 붙어 것 같다 무엇 또한

입니다 내 다른 것과 마찬가지), 단순히 콜렉션을 올바른 호출 매개 변수로 가장 잘 캐스팅하는 방법. 또한 어떤 종류의 컬렉션을 사용할지에 대한 도움이나 조언은 크게 감사하겠습니다. IEnumerable<object>ToArray를 호출 * 하나 개의 옵션입니다 -

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

또한 고마워, servy. :) – geostocker

답변

1

당신이 Invoke의 인수 목록으로 object[]이 필요합니다 가정 :

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

는 여기에 내가 호출하려는 방법의 두 가지 예

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[]으로 시작하는 것이 가장 좋습니다.

값이 입력되지 않은 문자열 (예 : 사용자 입력)에서 시작하는 경우 Cast 대신 Convert.ChangeType을 사용하여 매개 변수 유형을 일치 시키십시오. ChangeType은 더 복잡한 유형이 필요한 경우 문자열 - 숫자 유형 변환에 사용됩니다. 자체 변환 논리를 사용하십시오.

+0

컬렉션의 개별 요소 (목록 매개 변수)가 요소가있는 개체 []로 캐스팅됩니까? 매개 변수가 [ "1", "2", "3"]이면 paramAsObjects는 [ "1", "2", "3"]입니까? – geostocker

+0

@geostocker 예.객체에 캐스트하면 매개 변수 유형이 변경되지 않으므로'string'을'int' 매개 변수로 전달할 수 없습니다. –

+0

@Alexei : 그럼 ... 당신의 대답은 기술적 인면에서는 정확하지만 기능적 차원에서는 완전히 실패 할 것입니다 : 그는 beautiyfull 예외를 받게 될 것입니다 ... –