2011-11-19 45 views
4

即使一切看起來非常正確,我也得到一個調用Type.GetMethod()的函數的AmbigiousMatchException。C#動態函數AmbigiousMatchException?

public partial class IBaseEvent 
{ 
    private Dictionary<int, Func<object[], object>> funcs = new Dictionary<int,Func<object[],object>>(); 
    private Dictionary<int, object[]> func_args = new Dictionary<int,object[]>(); 

    public void Execute() 
    { 
     int exp = 0; 
     foreach(var func in funcs) 
     { 
      exp = func.GetHashCode(); 
      func.Value.DynamicInvoke(func_args[exp]); 
     } 
    } 

    public void AddFunction(Type T, dynamic sFunc, params object[] parameters) 
    { 
     funcs.Add(T.GetHashCode(), new Func<object[],object>(T.GetMethod(sFunc))); 
     func_args.Add(T.GetHashCode(), parameters); 
    } 
} 

public class DummyEvent : IBaseEvent 
{ 
    private string EventType = "DUMMY_EVENT"; 

    public DummyEvent() 
    { 
     object[] parm = new object[3]; 
     parm[0] = Logging.LOG_TYPE.DEBUG; 
     parm[1] = "Hello World from DummyEvent! TypeCode: {0}"; 
     parm[2] = typeof(DummyEvent).GetType().GUID; 

     AddFunction(typeof(Logging.LoggingFactory), "WriteToLog", parm); 
    } 
} 

AddFunction上的錯誤(typeof(Logging.LoggingFactory),「WriteToLog」,parm);

我在做什麼錯?我該如何糾正這一點?

+1

你能分享你的'Logging'類? –

回答

1

看起來像你是不必要的複雜的東西。只要您將它添加到列表中,函數和它的參數都是已知的。你有沒有考慮過使用匿名函數呢?作爲一個例子,我已經包裝了這個對象..在這個例子中的字符串參數。 DynamicInvoke也會相當慢。

另外兩種不同的類型可以返回相同的GetHashCode這取決於您的特定需求可能或可能不重要。

public partial class IBaseEvent 
    { 
     private Dictionary<int, Action> funcs = new Dictionary<int, Action>(); 

     public void Execute() 
     { 
      foreach (var func in funcs.Values) 
      { 
       func(); 
      } 
     } 

     public void AddFunction(Type t, Action ff) 
     { 
      funcs.Add(t.GetHashCode(), ff); 
     } 
    } 

    public class DummyEvent : IBaseEvent 
    { 
     private string EventType = "DUMMY_EVENT"; 

     private void DoSomething(string x) 
     { 
      Console.WriteLine(x); 
     } 

     public DummyEvent() 
     { 
      Action temp =() => 
       { 
        DoSomething("Hello World from DummyEvent! TypeCode"); 
       }; 

      AddFunction(typeof(Logging), temp); 
     } 
    } 

如果嚴格不需要類型可以進一步簡化它像這樣

public partial class IBaseEvent 
{ 
    public Action MyAction; 


    public void Execute() 
    { 
     MyAction(); 
    } 

    public void AddFunction(Action ff) 
    { 
     MyAction += ff; 
    } 
} 
+0

我只是使用散列碼作爲臨時存儲。它通常從處理隊列中刪除,這就是爲什麼散列碼也沒有什麼關係。 –

+0

我編輯了我的答案,以便進一步簡化它,如果不需要類型映射 –

2

根據錯誤消息,我懷疑您可能已經在LoggingFactory或其繼承鏈中具有函數WriteToLog

+0

是的,有兩個WriteToLog函數具有不同的參數計數。一個是 公共靜態INT WriteToLog(LOG_TYPE PTYPE,串消息) 另一個是 公共靜態INT WriteToLog(LOG_TYPE PTYPE,串pFormat,params對象[] pParams –

+0

的問題是,所述第二過載是從本質上沒有區別第一個,除非你提供參數,如果可以,我會建議添加另一個非操作參數或改變前兩個參數的順序 –