2010-12-09 28 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); 
相關問題