我正在尝试遵循 Pro C# 5.0 一书中的示例,但我偶然发现了一个我无法工作的示例:
static void Main() {
Assembly asm = Assembly.Load("CarLibrary");
Type MiniVan = asm.GetType("CarLibrary.MiniVan");
dynamic d = Activator.CreateInstance(Minivan);
Console.WriteLine("Type of d is {0}", d.GetType()); // Type is CarLibrary.MiniVan
MethodInfo m = MiniVan.GetMethod("TurboBoost");
m.Invoke(d, null); // This works fine, and prints out "Turbo Boosting"
d.TurboBoost(); // This doesn't work like the book says it should.
// I get: object does not contain a definition for TurboBoost;
这是 CarLibrary 的声明:
namespace CarLibrary {
// UPDATE: I just realized that I had declared MiniVan internal
internal MiniVan {
public void TurboBoost() {
Console.WriteLine("Turbo Boosting");
}
}
}
因此,即使 MiniVan 被声明为 INTERNAL,使用反射我仍然可以创建 MiniVan 的实例,并调用 TurboBoost()。但是,如果我使用 dynamic 关键字,则对 TurboBoost() 的调用将不起作用。如果 MiniVan 被声明为 PUBLIC,那么这两种情况都可以完美运行。
有人能告诉我这一切是否如想象的那样吗?