C#:如何对现有对象的静态成员进行方法调用

时间:2010-12-09 19:56:50

标签: c#

所以我正在使用以下内容对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实例上调用该方法?

由于

3 个答案:

答案 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);