在C#/Silverlight应用程序中使用反射访问私有方法

在C#/Silverlight应用程序中使用反射访问私有方法,c#,silverlight,reflection,C#,Silverlight,Reflection,我的代码使用反射调用方法: scoringType.InvokeMember("scoringClient_ScorePostsCompleted", BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.NonPublic, null, scoringInstance, new object[] { sArg, eArg });

我的代码使用反射调用方法:

        scoringType.InvokeMember("scoringClient_ScorePostsCompleted",
            BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.NonPublic,
            null, scoringInstance,
            new object[] { sArg, eArg });
其中scoringInstance是ModelView类的实例。该方法是私有的,但我使用BindingFlags.NonPublic,因此,我应该能够访问它,但我无法-我获取MethodAccessException异常:“尝试通过方法…访问方法…失败。” 谷歌似乎没有答案。你知道如何在任何时候修复它吗?

来自silverlight

在Silverlight中,不能使用反射来访问私有类型和 成员。如果类型或成员的访问级别会阻止您 通过在静态编译代码中访问它,您无法访问它 动态地使用反射

编辑:


Silverlight 5现在仅当您在浏览器外或浏览器内以提升的权限运行时(在浏览器中使用生成的测试页面不起作用),才允许反射私有成员。

如果您需要访问非公共成员,可以使用LambdaExpression执行此操作。
我写了这篇文章,详细解释了它的工作原理。

查看ReflectionPermission类。谢谢!你救了我几个小时的失败尝试:)@MerickOWA,有什么解决办法吗?有没有办法信任我的应用程序
Reflection.Emit
?@Shimmy我做了更多的测试,唯一的解决办法是在浏览器中或浏览器外使用具有提升权限的Silverlight 5。Silverlight 4提升权限不允许反射。自从Silverlight 5发布以来,我将更新答案以反映这一点。我在SL 5上。我将对提升信任进行研究。仅供参考,在Mac OSX上获得具有提升权限的私人成员的能力存在缺陷。我必须解决这样一个问题:叶类中的代码可以访问私有成员,但叶的父类中完全相同的代码不能访问私有成员。。。这很奇怪。LamdaExpression不适用于标有SecuritySafeCriticalAttribute的SL 5.NET内部方法。您测试过您的解决方案吗?不幸的是,此解决方案也不适用于具有
SecuritySafeCriticalAttribute
属性的内部方法。