【发布时间】: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