在没有代码的Web服务中访问内部类和方法

时间:2013-09-25 09:21:28

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

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

然后我有一个额外的web服务用于测试东西。它没有代码,其代码直接在.asmx文件中,因此我可以快速将其上传到服务器而无需重建任何内容。此测试Web服务与第一段中提到的Web服务和同一项目中的Web服务位于相同的MyNamespace命名空间中。它很有效,直到我尝试访问MyNamespace的内部成员。它无法完成,它们是隐形的,就好像它们是私有的一样。

这是我可能开始写废话的地方,所以请在必要时纠正我。我已经环顾了一下,看起来这是'打算',因为没有正确代码的.asmx在运行时编译而不是正确程序集的一部分。由于内部成员仅在程序集中可用,因此在我的.asmx代码中不可用它们是完全正确的。我的问题是 - 我可以以某种方式访问​​这些成员,而无需将我的代码移到文件后面的.asmx.cs代码中吗?

1 个答案:

答案 0 :(得分: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)