2010-02-18 2 views
0

다른 개체를 만드는 여러 가지 메서드 (50)가있는 웹 서비스를 사용하고 있습니다.
예 :
CreateObject1 (OBJ 오브젝트 1, INT ARG2)
CreateObject2 (Object2 OBJ, INT ARG2)
...
CreateObjectX (ObjectX OBJ, INT ARG2)대리자 서명 불일치로 인해 CreateDelegate가 실패합니다.

모든 오브젝트 (오브젝트 1, Object2, ObjectX ...) ObjectBase에서 상속됩니다.

그래서 나는
delegate void DlgtCreateObject(ObjectBase obj, int arg2); 

public void CreateObject(ObjectBase obj, int arg2) 
{ 
    DlgtCreateObject dlgt; 
    string objType; 
    string operation; 

    objType = obj.GetType().ToString(); 
    operation = "Create" + objType.Substring(objType.LastIndexOf(".") + 1); 

    using (MyWebService service = new MyWebService()) 
    { 

     dlgt = (DlgtCreateObject)Delegate.CreateDelegate(typeof(DlgtCreateObject), 
                 service, 
                 operation, 
                 false, 
                 true); 
     dlgt(obj, arg2); 
    } 
} 

불행하게도이 나에게 바인딩하지 못했습니다 예외를 제공합니다 ...이 작업을 수행하려합니다. 대리자 시그니처가 특정 클래스를 사용하는 함수의 첫 번째 인수로 ObjectBase를 사용하기 때문입니다.

이 방법이 있습니까? 당신은 단지여기에서 메서드를 호출하려는 경우

답변

1

, 난 당신이 대신 대표를 통해가는 Type.GetMethodMethodBase.Invoke을 사용하는 것이 좋습니다. 그러면이 문제가 발생하지 않을 것입니다.

+0

내가 일반적인 위임 내 딜레마를 해결할 수 있었던 것 같다 ... 트릭을 할 것으로 보인다. GetMethod 및 Invoke를 대리자를 통해 사용하면 얻을 수있는 이점은 무엇입니까? –

+0

다음과 같이 가정합니다. service.GetType(). GetMethod (작업) .Invoke (서비스, 새 개체 [] {obj, arg2}); –

+0

@Nate : 기본적으로 메서드를 호출하려는 경우에는 올바른 대리자 형식이 필요하지 않습니다. CreateDelegate를 통해가는 것은 약간 길어 보인다. –

0

오른쪽 게시 후 나는 제네릭이 해답이 될 수있다 생각하고, 실제로 다음은

delegate void DlgtCreateObject<T>(T obj, int arg2) where T : ObjectBase; 

public void CreateObject<T>(T obj, int arg2) where T : ObjectBase; 
{ 
    DlgtCreateObject dlgt; 
    string objType; 
    string operation; 

    objType = obj.GetType().ToString(); 
    operation = "Create" + objType.Substring(objType.LastIndexOf(".") + 1); 

    using (MyWebService service = new MyWebService()) 
    { 

     dlgt = (DlgtCreateObject<T>)Delegate.CreateDelegate(typeof(DlgtCreateObject<T>), 
               service, 
               operation, 
               false, 
               true); 
     dlgt(obj, arg2); 
    } 
}  
관련 문제