2008-11-10 2 views
3

호출 할 WS 메서드의 이름과 서비스가받는 유일한 매개 변수의 형식과 값을 저장하는 클래스가 있습니다 (매개 변수의 컬렉션이되지만 간단하게 유지할 수 있습니다)이 예를 들면 :매개 변수가 일반에서 가져온 메서드를 호출하십시오.

public class MethodCall 
{ 
    public string Method { get; set; } 
    public Type ParType { get; set; } 
    public string ParValue { get; set; } 
    public T CastedValue<T>() 
    { 
    return (T)Convert.ChangeType(ParValue, ParType); 
    } 
} 

나는 메소드 이름과 매개 변수를 사용하고 반사를 사용하는 방법을 호출하고 결과를 반환하는 방법이있다. 그걸 사용하면 잘 작동합니다.

callingclass.URL = url; 
callingclass.Service = serviceName; 
object[] Params = { (decimal)1 }; 
callingclass.CallMethod("Hello", Params); 

그러나이 예의 십진법은 MethodCall의 인스턴스에서 제공됩니다. 이 코드 그래서 만약 :

MethodCall call = new MethodCall(); 
call.Method = "Hello"; 
call.ParType = typeof(decimal); 
call.ParValue = "1"; 

옵션 1, 컴파일되지 않습니다 :

object[] Params = { (call.ParType)call.ParValue }; //Compilation error: The type or namespace name 'call' could not be found (are you missing a using directive or an assembly reference?) 

옵션 2,도 컴파일하지 않습니다

object[] Params = { call.CastedValue<call.ParType>() }; //Compilation error: Cannot implicitly convert type 'call.ParType' to 'object' 

옵션 3, 반사를 사용하여 컴파일 할 수는 있지만 서비스를 호출 할 때는 작동하지 않습니다.

object[] Params = { typeof(MethodCall).GetMethod("CastedValue").MakeGenericMethod(call.ParType).Invoke(this, null) }; 

callingclass.CallMethod(call.Method, Params); 

예외 : ConnectionLib.WsProxyParameterExeption : URL 'http://localhost/MyTestingService/'의 'TestService.Hello'메서드에 대한 매개 변수가 잘못되었습니다.

그렇다면 누군가 내가이 작업을 수행하는 올바른 방법을 가르쳐 줄 수 있습니까?

감사

답변

2

미안 해요, 내가 추가 한 것을 난 그냥이 작업을 수행 할 경우 :

object[] Params = { Convert.ChangeType(call.ParValue, call.ParType)}; 

가 잘 작동하지만 호출 객체의 일반적인 방법의 요점이 때 캐스팅을 방지하는 것입니다 사용되고있다.

2

10 진수로 문자열 ("1")을 캐스팅 할 수는 없으며 일반 버전이 그것에 대해 알고 있다고 의심 할 수는 있지만 ... 참조 보존 형 캐스팅을 시도하지만, 어디에서 - 연산자 변환이 필요합니다 (그들은 C#에서 구문을 공유하지만 매우 다릅니다).

기본적으로 Convert.ChangeType은 여기에서 유일하게 의미있는 옵션입니다.

나는 generics를 통해 연산자 변환을 사용할 수 있지만이 있지만 문자열과 소수 사이의 연산자 변환이 없으므로 도움이되지 않습니다.

2

리플렉션을 사용하여 메서드를 호출하면 어쨌든 캐스팅이 끝날 것입니다. 여기에 제네릭의 속도 이점이나 컴파일 타임 형태의 안전 이점이 없습니다. 실제로 사용하는 것으로 어떤 호의를 베풀지는 않습니다. 당신이 어딘가에 적어도 , 컴파일시에 정적으로 유형을 할 알고

제네릭 유용합니다. ParType 속성을 가지고 있다는 사실은 실제로 제네릭의 관점에 어긋납니다.

관련 문제