我在某个命名空间中有一个web服务,我们称之为MyNamespace
。这是一个普通的Web服务,后面的代码中有webmethods。我还有一个额外的.cs文件,其中包含这些webmethods中使用的各种类。到目前为止很好,对吗?
然后我有一个额外的web服务用于测试东西。它没有代码,其代码直接在.asmx文件中,因此我可以快速将其上传到服务器而无需重建任何内容。此测试Web服务与第一段中提到的Web服务和同一项目中的Web服务位于相同的MyNamespace
命名空间中。它很有效,直到我尝试访问MyNamespace
的内部成员。它无法完成,它们是隐形的,就好像它们是私有的一样。
这是我可能开始写废话的地方,所以请在必要时纠正我。我已经环顾了一下,看起来这是'打算',因为没有正确代码的.asmx在运行时编译而不是正确程序集的一部分。由于内部成员仅在程序集中可用,因此在我的.asmx代码中不可用它们是完全正确的。我的问题是 - 我可以以某种方式访问这些成员,而无需将我的代码移到文件后面的.asmx.cs代码中吗?
答案 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)