1

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

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

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

4

1 回答 1

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)
于 2013-09-25T10:22:02.740 回答