所以我正在使用以下内容对dll进行测试:
--test.dll--
namespace MyNamespace
{
internal class foo
{
private static bar myBarClass = new bar();
]
internal class bar
{
public void aMethod();
}
}
----
现在在另一个程序中,我有一个现有的foo实例(通过反射获得)。现在我想从现有的foo实例中的myBarClass调用方法aMethod()。不知道怎么做。
foo myFooObject = GetInstanceOfFoo(); //i get an instance of foo via reflection
Assembly testAssembly= Assembly.LoadFrom(c:\test.dll);
object o = testAssembly.CreateInstance("MyNamespace.bar");
Type t = o.GetType();
BindingFlags bf = BindingFlags.Instance | BindingFlags.NonPublic;
MethodInfo mi = t.GetMethod("aMethod", bf);
mi.Invoke(<notsurewhatgoeshere!>, null);
我能够获得正确的方法信息。我的问题是在mi.Invoke中,如何在现有的foo.bar实例上调用该方法?
由于
答案 0 :(得分:3)
var myBarClass = testAssembly.GetType("MyNamespace.foo")
.GetField("myBarClass", BindingFlags.NonPublic |
BindingFlags.Static)
.GetValue(null);
mi.Invoke(myBarClass, null);
请注意,您不需要构建自己的实例(因为您已经存在),因为您无论如何都不会使用它。
所以你要使用的完整代码是:
Assembly testAssembly= Assembly.LoadFrom(@"c:\test.dll");
Type t = testAssembly.GetType("MyNamespace.bar");
BindingFlags bf = BindingFlags.Instance | BindingFlags.NonPublic;
MethodInfo mi = t.GetMethod("aMethod", bf);
object myBarClass = testAssembly.GetType("MyNamespace.foo")
.GetField("myBarClass", BindingFlags.NonPublic |
BindingFlags.Static)
.GetValue(null);
mi.Invoke(myBarClass, null);
答案 1 :(得分:1)
myBarClass
是一个静态字段。
它与foo
的任何单个实例无关。
要从类中获取私有静态字段中的对象,可以编写
var type = testAssembly.GetType("MyNamespace.bar");
var field = type.GetField("myBarClass", BindingFlags.Static | BindingFlags.NonPublic);
object value = field.GetValue(null);
答案 2 :(得分:0)
要通过反射执行操作,请将null传递给方法信息。您还必须传递Static
绑定标记。
var methodinfo = o.GetMethod("aMethod", BindingFlags.Static | BindingFlags.NonPublic);
methodinfo.Invoke(null, null);