通过反射创建开放实例委托

亚历克斯·B。

为什么以下代码会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);

有机会工作吗?

格奥尔格·维塞格(GeorgWiesehügel)
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

  • 因为的签名与DoMagicDelmi描述的方法的签名不匹配。

有机会工作吗?

  • 是的,用于MakeGenericType匹配mi的签名:

    #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
    

我希望我还不算太晚...

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何抛出通过反射创建的Exception类的实例?

来自分类Dev

Python:从基类创建自身的新实例(可能通过反射?)

来自分类Dev

使用反射创建实例

来自分类Dev

无法使用反射实例化此委托

来自分类Dev

如何通过反射使用内部构造函数创建类的对象实例?

来自分类Dev

如何通过传递Object []而不是带有反射的参数列表来创建类的新实例

来自分类Dev

通过反射实例化泛型类

来自分类Dev

Kotlin 数据类通过反射实例化

来自分类Dev

如何使用Java反射创建Protobuf实例?

来自分类Dev

C#反射,从文本创建实例

来自分类Dev

使用反射 C# 创建 List 的实例

来自分类Dev

通过反射创建通用功能

来自分类Dev

通过HasValue = false的反射可空创建

来自分类Dev

从反射调用静态委托?

来自分类Dev

从反射调用静态委托?

来自分类Dev

C# 委托与反射

来自分类Dev

如何将通过反射获得的方法分配给委托?(或者:如何通过反射来加快方法调用的速度)

来自分类Dev

如何通过类类型委托构造函数的实例化?

来自分类Dev

通过反射调用实例方法,就好像它是静态的

来自分类Dev

通过具有匿名类型的反射实例化对象

来自分类Dev

如何通过反射正确实例化内部类?

来自分类Dev

通过反射实例化Scala类/案例类

来自分类Dev

如何通过反射从单例类获取实例

来自分类Dev

通过反射获取对象属性(实例属性除外)

来自分类Dev

使用构造函数通过反射实例化对象

来自分类Dev

SimpleInjector工厂委托-创建具有依赖项的实例

来自分类Dev

Java反射创建未知类和构造函数的实例

来自分类Dev

使用Java中的反射来创建新实例?

来自分类Dev

通过带有委托参数的反射调用泛型方法的问题

Related 相关文章

热门标签

归档