2010-12-09 27 views
1

所以我在一个dll执行测试有以下:C#:如何使一个方法调用现有对象的静态成员上

--test.dll-- 
namespace MyNamespace 
{ 
    internal class foo 
    { 
     private static bar myBarClass = new bar(); 
    ] 

    internal class bar 
    { 
     public void aMethod(); 
    } 
} 
---- 

现在在另一个节目,我有富的现有实例(通过反射获得)。现在我想从现有的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实例上调用该方法?

感谢

+2

你是否确定你应该使用反射? – SLaks 2010-12-09 19:59:37

+0

我相信你通过o实例...不是100%所以不张贴为答案... – 2010-12-09 20:01:02

+0

@SLaks我认为(希望)@Justin别无选择 - 如果他有控制`test.dll`中的代码,该解决方案肯定会揭露该实例及其方法... – 2010-12-09 20:02:24

回答

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

myBarClass是一个静态字段。

它与foo的任何单个实例无关。

要获得从一个类的私有静态字段中的对象,你可以写

var type = testAssembly.GetType("MyNamespace.bar"); 
var field = type.GetField("myBarClass", BindingFlags.Static | BindingFlags.NonPublic); 
object value = field.GetValue(null); 
0

要通过反射做,在空传递给你的方法的信息。您还必须通过Static绑定标志。

var methodinfo = o.GetMethod("aMethod", BindingFlags.Static | BindingFlags.NonPublic); 
methodinfo.Invoke(null, null); 
相关问题