2014-02-07 51 views
0

爲什麼以下Delegate.CreateDelegate產生運行時ArgumentException?通過反射創建打開的實例代理

static class Module1 
{ 
    public static void Main() 
    { 
     MyDataObject mdo = new MyDataObject(); 
     mdo.DoMagic("Hello"); 
    } 

    #region Assembly A 
    public class BusinessObject 
    { 
    } 

    public class MyBusinessObject : BusinessObject 
    { 

     public void DoMagic(string s) 
     { 
      Console.WriteLine(s); 
     } 
    } 
    #endregion 

    #region Assembly B 
    public class MyDataObject 
    { 
     private delegate void DoMagicDel(BusinessObject bo, string s); 

     private DoMagicDel delDoMagic; 
     public void DoMagic(string s) 
     { 
      BusinessObject bo = (BusinessObject)Activator.CreateInstance(Type.GetType("Module1+MyBusinessObject")); 
      MethodInfo mi = bo.GetType().GetMethod("DoMagic", BindingFlags.Public | BindingFlags.Instance); 
      // ArgumentException: Cannot bind to the target method because its signature or security transparency is not compatible with that of the delegate type. 
      delDoMagic = (DoMagicDel)Delegate.CreateDelegate(typeof(DoMagicDel), null, mi); 
      delDoMagic(bo, s); 
     } 
    } 
    #endregion 
} 

其中大會A具有對大會B的項目引用,但反之亦然。 當我將第一個參數DoMagicMel更改爲鍵入MyBusinessObject時,它起作用。但由於程序集B不`噸知道這種類型的組件A的,這隻有在我簡單的例子:

private delegate void DoMagicDel(MyBusinessObject bo, string s); 

任何機會得到這個工作?

回答

2
ArgumentException: Cannot bind to the target method because its signature or security transparency is not compatible with that of the delegate type. 

爲什麼以下Delegate.CreateDelegate生產運行ArgumentException

  • 由於DoMagicDel的簽名與mi描述的方法的簽名不匹配。

有沒有可能獲得該工作?

  • 是,使用MakeGenericType匹配英里的簽名:

    #region Assembly B 
    public class MyDataObject 
    { 
        public delegate void DoMagicDel<T1>(T1 arg1, string arg2); 
        private static Delegate delDoMagic; 
        public void DoMagic(string s) 
        { 
         var bo = Activator.CreateInstance("Module1", "Module1.MyBusinessObject").Unwrap(); 
         MethodInfo mi = bo.GetType().GetMethod("DoMagic", BindingFlags.Public | BindingFlags.Instance); 
         var doMagicDelType = typeof(DoMagicDel<>).MakeGenericType(bo.GetType());    
         if (delDoMagic == null) 
          delDoMagic = Delegate.CreateDelegate(doMagicDelType, null, mi); 
         delDoMagic.DynamicInvoke(bo, s); 
        } 
    } 
    #endregion 
    

我希望我不是太晚了......