通过反射以静态方式调用非静态方法

oli*_*ver 2 c# reflection

我有一个声明虚拟方法的类。但是,此方法的特定实现未明确引用“ this”对象。他们只是返回一个特定于该类的值。

因此,人们可能一直希望不仅在特定对象上而且在类本身上都调用此方法。由于在语法层面上这当然是不可能的,所以我认为至少应该通过反思来实现。也就是说,我要遍历程序集中的所有类,并确定哪个类返回哪个值作为所述方法的响应。

但是,我的幼稚方法在尝试调用该方法时失败,并出现了空引用异常。为什么?我希望它能够成功,因为我已经使用了一个具体的类来标识具体的重写方法,因此不需要“ this”对象及其虚拟方法表来解析该方法。

我该如何运作?(当然,不包括定义第二个返回相同值的真正静态方法的“解决方案”)。

using System;
using System.Reflection;

namespace StaticInvoke
{
    public abstract class Foo
    {
        public abstract string StaticValue {get;}
    }

    public class MyFirstFoo: Foo
    {
        public override string StaticValue {get {return "A first attempt to foo-ize Foo.";}}
    }

    class Program
    {
        public static void Main(string[] args)
        {
            Type myFirstFooType = typeof(MyFirstFoo);
            PropertyInfo myFirstStaticValueProperty = myFirstFooType.GetProperty("StaticValue");
            MethodInfo myFirstStaticValueMethod = myFirstStaticValueProperty.GetGetMethod();

            string result = (string)myFirstStaticValueMethod.Invoke(null, null);

            Console.WriteLine("MyFirstFoo.StaticValue == "+result);

            Console.Write("Press any key to continue . . . ");
            Console.ReadKey(true);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Eri*_*ips 6

但是,此方法的特定实现未明确引用“ this”对象。

是的,c#语言不需要前缀,this因为它没有必要。

因此,人们可能一直希望不仅在特定对象上而且在类本身上都调用此方法。

是不可能的。C#不允许实例方法和静态方法使用相同的名称。因此,这种愿望无法解决,因此必须采取其他解决方案。

由于在语法层面上这当然是不可能的,所以我认为至少应该通过反思来实现。

反射仅在允许的范围内进行。如果您不能同时使用相同名称的静态实例和实例,则Reflection 不会解决它

但是,我的幼稚方法在尝试调用该方法时失败,并出现了空引用异常。为什么?

因为您在NULL上调用了Instance Method。您的示例可以简化为:

(null as string).Count()
Run Code Online (Sandbox Code Playgroud)

同样的事情,没有反思。您不能在NULL上调用Count()。

我希望它能够成功,因为我已经使用了一个具体的类来标识具体的重写方法,因此不需要“ this”对象及其虚拟方法表来解析该方法。

你仍然不能不管你怎么称呼一个空对象的方法施放它。

我该如何运作?(当然,不包括定义第二个返回相同值的真正静态方法的“解决方案”)。

不能基于以下要求:

不仅要在特定对象上调用此方法,还要在类本身上调用此方法。

更新1:

相反,无论解决方案是什么,我的要求都是在静态上下文中获取实例方法主体(值)中包含的明显静态信息。

这确实很令人困惑,因此下面是示例代码:

public class Person
{
  // So this is "Static Inforamtion"
  public static int StaticInformation()
  {
    return 1;
  }

  // instance method
  public static int InstanceMethod()
  {
    return StaticInformation();
  }
}

public static class StaticClass
{
  public static int StaticContext()
  {
    return Person.InstanceMethod();
  }
}
Run Code Online (Sandbox Code Playgroud)

这是根据您的陈述而假定的。这是我最好的描述您的句子为代码的方法。对大多数(如果不是全部).Net开发人员来说,说静态信息应该意味着标记为静态的方法,属性或字段。但是,声明包含在实例主体中的静态信息非常不明确。什么是身体?实例方法的主体还是类的主体?

我也想知道为什么有人要这样做。看来这只是一个理论问题,无法解决任何现实情况。在C#的哪种情况下我将拥有一个排序的方法指针(MethodInfo),并且想在不知道自己是否有实例的情况下调用它?如果期望得到相同的结果,那么为什么根本需要Instance方法呢?