.net 通过反射创建开放实例委托
为什么以下.net 通过反射创建开放实例委托,.net,vb.net,reflection,delegates,contravariance,.net,Vb.net,Reflection,Delegates,Contravariance,为什么以下Delegate.CreateDelegate生成运行时参数异常 static class Module1 { public static void Main() { MyDataObject mdo = new MyDataObject(); mdo.DoMagic("Hello"); } #region Assembly A public class BusinessObject { }
Delegate.CreateDelegate
生成运行时参数异常
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);
有机会让它工作吗
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
- 因为
的签名与mi描述的方法的签名不匹配DoMagicDel
ArgumentException: Cannot bind to the target method because its signature or security transparency is not compatible with that of the delegate type.
- 是,使用
匹配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
#区域组件B 公共类MyDataObject { 公共委托void DoMagicDel(T1 arg1,字符串arg2); 私有静态委托delDoMagic; public void DoMagic(字符串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); 动力三角帆蚌(bo,s); } } #端区