【问题标题】:Is it possible to call private delegate by reflection? if Yes then How? if No then What is the reason?是否可以通过反射调用私人委托?如果是,那么如何?如果否,那么原因是什么?
【发布时间】:2017-09-29 14:47:51
【问题描述】:

我正在反射上测试控制台应用程序以调用访问修饰符为私有的委托。 代码如下所示:

    public class EventPublisher
    {
        private delegate void PrivateDelegate(string message);
        public delegate void PublicDelegate(string message);
    }

    public class PrivateDelegateSubscriber
    {
        public void Subscribe(EventPublisher evPub)
        {
            Type t = typeof(EventPublisher);
            MemberInfo[] privateDelegate = t.GetMember("PrivateDelegate", BindingFlags.NonPublic);

            Delegate delByReflection = Delegate.CreateDelegate((System.Type)privateDelegate.GetValue(0), this, "MethodForPrivateDelegate");
            // how to call the private delegate like public delegate below?

            Delegate delByReflection2 = Delegate.CreateDelegate(typeof(EventPublisher.PublicDelegate), this, "MethodForPrivateDelegate");
            EventPublisher.PublicDelegate delByReflection2_ins = (EventPublisher.PublicDelegate)delByReflection2;
            delByReflection2_ins("test public delegate");
        }

        public void MethodForPrivateDelegate(string message)
        {
            Console.WriteLine("This is from private delegate subscriber, writing: " + message);
        }
    }

我已经测试了公共代表并且它按预期工作,但我还没有找到任何方法可以在私人代表上做到这一点。我的问题是上面的注释代码是否有任何方法可以做到,或者不可能的原因。

提前致谢

【问题讨论】:

  • 你“需要”投吗?只是在代表上调用DynamicInvoke 不够吗?另外,有点明显,point 是什么?在这两种情况下,您都在创建一个委托,然后有效地调用您已经有权访问的代码 (MethodForPrivateDelegate)
  • 我已将其更新为使用“呼叫”。它正在使用 DynamicInvoke。这里调用的方法只是简化测试。谢谢

标签: c# .net reflection delegates


【解决方案1】:

如何像下面的公共代表一样转换为私人代表?

你没有。强制转换是编译时声明,需要访问相关类型。 不可能声明一个变量,该变量的类型对于您试图声明该变量的代码而言是不可访问的。

但是,您仍然可以使用DynamicInvoke() 方法调用这样的委托。例如:

delByReflection.DynamicInvoke("test private delegate");

【讨论】:

    猜你喜欢
    • 2014-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 2021-02-25
    • 2014-12-03
    相关资源
    最近更新 更多