2012-03-07 2 views
2

...C#으로 인수로 문자열 배열을 메서드를 호출 반사를 사용하는 방법 아래 그림과 같이 내가하는 방법이

public bool MakeRequest(string[] args) 
    { 
     try 
     { 
      sXmlRequest = args[0]; 
      sResponse = ""; 
      Console.WriteLine(sXmlRequest); 
      sw.Write(sXmlRequest); 
      sw.Flush(); 
      sResponse = sr.ReadToEnd(); 
      return true; 
     } 
     catch (Exception e) 
     { 
      sResponse = e.Message; 
      return false; 
     } 

    } 

나는 방식으로 인해, 반사를 사용하여이 메서드를 호출해야 전체 프레임 워크가 설정됩니다. 여기

는 Fit.TcpConnector.MakeRequest가 발견되지 않는 방법을 말하는 MissingMethodException이 내가

string[] innerargs = {"Dummy Args"}; 
string pAssembly = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\TCPConnector.dll"; 
Assembly assemblyInstance = Assembly.LoadFrom(pAssembly); 
Type tConnector = assemblyInstance.GetType("Fit.TcpConnector"); 
Object oLateBound = assemblyInstance.CreateInstance(tConnector.FullName); 

result = tConnector.InvokeMember("MakeRequest", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Instance, null, oLateBound, innerargs); 

이 나를 반환 전화를 사용하고 코드입니다. 그때

public bool MakeRequest(string args) 

대신

public bool MakeRequest(string[] args) 

로하여 makeRequest의 서명을 변경하는 경우

그러나, 그것은 노력하고 있습니다. 누구든지 매개 변수로 배열을 사용하는 함수를 호출 할 때 올바른 방향으로 나를 가리킬 수 있습니까?

+0

왜 헝가리 표기법을 사용하고 있습니까? 컴파일러가 이미 유형을 검사하기 때문에별로 유용하지 않습니다. – svick

+0

나는 똑같은 생각을 해왔다. 너무 많이 vbscripting 나를 따라갈 수 있습니다. 하지만, 이제는 안된다고 느끼고 있습니다. 귀하의 질문은 그 표기법을 떠날 때 다시 생각하게했습니다. – Buddha

답변

5

귀하는 귀하의 배열을 포함하는 배열을 통과해야 :

는 메서드에 전달한 배열의 각 항목은 함수에 하나 개의 매개 변수를 나타 내기 때문이다
tConnector.InvokeMember(
    "MakeRequest", 
    BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Instance, 
    null, oLateBound, new object[] { innerargs }); 

. 그리고 함수는 string[] 유형의 매개 변수 하나를 가지고 있으므로 string[] 유형의 항목 하나가 포함 된 배열을 제공해야합니다. 에릭 Lippert의 그의 대답에 지적

var makeRequestMethod = tConnector.GetMethod("MakeRequest"); 
makeRequestMethod.Invoke(oLateBound, new object[] { innerargs }); 

귀하의 잘못된 코드 때문에 배열 공분산의 컴파일 : 나는 GetMethod()Invoke()를 사용하여 생각했다되고 그건

는 명확 InvokeMember()보다.

4

문자열 인수를 object 배열에 넣으면됩니다.

new Object[] { new String[] { "Mytext" } } 

이이 InvokeMember 그래서 당신의 문자열 배열은 객체 배열로 변환되어 각 문자열은 단일 매개 변수로 위협하고, 매개 변수로 object -array 소요된다는 점입니다해야 할 이유.

1

내재 가치가 잘못되었습니다. innerargs 배열에서

각 개체 그래서 당신은 정말

string[] innerargs = {"Dummy Args"}; 

object[] arg = {innerargs]; 

result = tConnector.InvokeMember("MakeRequest", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Instance, null, oLateBound, arg); 

을 또는 somesuch해야 하나 개의 매개 변수

을 나타냅니다.

1

인수 인수는 멤버에 전달할 인수의 배열, 그래서 귀하의 회원 인수는 다른 배열에 포장해야 배열, 그렇지 않으면 당신은 단지 하나의 문자열 인수 보내는 가정 인 경우

result = tConnector.InvokeMember("MakeRequest", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Instance, null, oLateBound, new object[] { innerargs }); 
6

C#은 요소 유형이 참조 유형 인 배열에 대해 배열 요소 유형 공분산을 지원합니다. 즉, string[]object[]으로 자동 변환 할 수 있습니다.

그래서 여기서 문자열의 배열을 전달하는 중입니다. 런타임에 "아, 예상했던 객체 배열이 있습니다."라고 말하면서 각 문자열은이 아닌 으로 전달됩니다. 문자열 배열을 인수로 전달하는 것보다

트릭 문자열의 배열보다는 문자열의 배열과 동일 하나를 포함 오브젝트의 배열을 확인하는 것이다.

관련 문제