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

C#:如何对现有对象的静态成员进行方法调用,c#,C#,因此,我在dll上执行以下测试: --test.dll-- namespace MyNamespace { internal class foo { private static bar myBarClass = new bar(); ] internal class bar { public void aMethod(); } } ---- 现在在另一个程序中,我有一个现有的foo实例(通过反射获得)。现在,我

因此,我在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);
foo myfoooobject=GetInstanceOfFoo()//我通过反射得到一个foo的实例
Assembly testAssembly=Assembly.LoadFrom(c:\test.dll);
对象o=testAssembly.CreateInstance(“MyNamespace.bar”);
类型t=o.GetType();
BindingFlags bf=BindingFlags.Instance | BindingFlags.NonPublic;
MethodInfo mi=t.GetMethod(“Method”,bf);
mi.Invoke(,null);
我能够得到正确的方法信息。我的问题是在mi.Invoke中,如何在已经存在的foo.bar实例上调用该方法


谢谢

myBarClass
是一个静态字段

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

要从类中获取私有静态字段中的对象,可以编写

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

myBarClass
是一个静态字段

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

要从类中获取私有静态字段中的对象,可以编写

var type = testAssembly.GetType("MyNamespace.bar");
var field = type.GetField("myBarClass", BindingFlags.Static | BindingFlags.NonPublic);
object value = field.GetValue(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);
请注意,您不需要构建自己的实例(就像您已经构建的那样),因为您无论如何都不会使用它

因此,您将使用的完整代码是:

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

要通过反射执行,请将null传递给方法信息。您还必须传入
静态
绑定标志

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

要通过反射执行,请将null传递给方法信息。您还必须传入
静态
绑定标志

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

你确定你应该使用反射吗?我相信你通过了o实例…不是100%,所以没有作为答案发布…@SLaks我想(希望)@Justin别无选择-如果他在
test.dll
中控制了代码,解决办法当然是只公开那个实例及其方法…@Aaron:这也是我粗略地看了一眼后的第一个想法,但所有的反映都让我们困惑。他甚至不需要
foo
@djacobson的实例:考虑到
foo
是在他的示例代码中显式输入的,我不确定情况是否如此。你确定你应该使用反射吗?我相信你通过了o实例…不是100%,所以不作为答案发布…@SLaks我假设(希望)@Justin别无选择-如果他能够控制
test.dll
中的代码,那么解决方案肯定是只公开该实例及其方法…@亚伦:这也是我粗略地看了一眼后的第一个想法,但所有的反映都让我们困惑。他甚至不需要
foo
@djacobson的实例:考虑到
foo
是在他的示例代码中显式键入的,我不确定是这样的。您确实需要反射。(1) 类型和字段不是公共的,(2)它们是动态加载的。我无法访问myBarClass,因为它是内部的?您确实需要反射。(1) 类型和字段不是公共的,(2)它们是动态加载的。我无法访问myBarClass,因为它是内部的?