【问题标题】:Accessing internal classes and methods in a webservice with no code behind在没有代码的情况下访问 Web 服务中的内部类和方法
【发布时间】:2013-09-25 09:21:28
【问题描述】:

我在某个命名空间中有一个网络服务,我们称之为MyNamespace。这是一个普通的 web 服务,后面的代码中有 webmethods。我还有一个额外的 .cs 文件,其中包含这些 webmethods 中使用的各种类。到目前为止一切顺利,对吧?

然后我有一个额外的 web 服务仅用于测试东西。它没有后面的代码,它的代码直接在 .asmx 文件中,所以我可以快速将它上传到服务器而无需重建任何东西。此测试 Web 服务与第一段中提到的 Web 服务位于相同的 MyNamespace 命名空间中,并且也在同一个项目中。在我尝试访问MyNamespace 的内部成员之前,它运行良好。这是不可能的,它们是不可见的,就好像它们是私有的一样。

到这里我可能开始写废话了,所以如果有必要请纠正我。我环顾了一下,似乎这是“有意的”,因为没有适当代码的 .asmx 是在运行时编译的,而不是适当程序集的一部分。由于内部成员仅在程序集中可用,因此它们在我的 .asmx 代码中不可用是完全正确的。那么我的问题是 - 我可以在不将我的代码移动到 .asmx.cs 代码隐藏文件的情况下以某种方式访问​​这些成员吗?

【问题讨论】:

    标签: c# asp.net web-services assemblies internal


    【解决方案1】:

    我想这可以通过反射来实现。

    例如:调用公共类的内部方法:

    var myPublicClass = new PublicClass;
    MethodInfo mInfo = typeof(PublicClass).GetMethod("InternalMethodName", BindingFlags.Instance | BindingFlags.NonPublic);
    
    var result = mInfo.Invoke(myPublicCLass, null) // (replace null with an array of parameters if necessary)
    

    或者在内部类的实例中创建:

    MethodInfo mInfo= Type.GetType(assemblyQualifiedName).GetConstructor(
                            BindingFlags.NonPublic | BindingFlags.Instance,
                            null,
                            new[] { typeof(string) },
                            null
                        );
    object myInstance = mInfo.Invoke(new[] { "constructorArgument" });
    

    编辑:内部静态类的内部静态方法:

    MethodInfo mInfo = Type.GetType(assemblyQualifiedName).GetMethod("InternalMethodName", BindingFlags.Static| BindingFlags.NonPublic);
    
    var result = mInfo.Invoke(null, null) // (replace 2nd null with an array of parameters if necessary)
    

    【讨论】:

    • 对,反思,完全忘记了,谢谢。不完全是我的想法,因为它不是最快的方法,但对于测试目的来说已经绰绰有余了。介意帮我举一个来自内部静态类的内部静态方法的例子吗? :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多