如何调用注入object的base-class方法?

How to invoke base-class method of injected object?

(我无法为这个没有拖延的问题想出一个简洁的标题。)

我有一个基础 class,它有一个 public 方法:

public class MyBaseClass
{
    public void MyBaseMethod()
    {
        // Here is where the functionality will go, that is described below.
    }
}

我有另一个 class,源自我的基础 class,其中包含注入的 objects,它也源自 MyBaseClass:

public class MyWorkingClass : MyBaseClass
{
    // All of these objects also derive from MyBaseClass.
    private readonly IClassOne _classOne;
    private readonly IClassTwo _classTwo;
    private readonly IClassThree _classThree;

    public MyWorkingClass(
        IClassOne classOne,
        IClassTwo classTwo,
        IClassThree classThree)
    {
        _classOne = classOne;
        _classTwo = classTwo;
        _classThree = classThree;
    }

    public SomeMethod()
    {
        // Stuff goes here.

        // Call base method here.
        MyBaseMethod();
    }
}

我想要发生的是对 MyBaseMethod 的调用将收集 class 中声明的所有字段。对于每个字段,获取它的实例并调用它自己的 MyBaseMethod.

我可以获取 class 实例中的所有字段:

var fields = GetType()
    .GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly)
    .ToList();

对于列表中的每个字段,我可以得到它的字段类型、实例和它自己声明的方法:

foreach (var field in fields)
{
    var fieldType = field.FieldType;

    var fieldInstance = field
        .GetValue(this);

    var methods = fieldType
        .GetMethods();
}

我的问题是我的 base-class 方法 MyBaseMethod 没有包含在方法列表中。 我也尝试过 GetRuntimeMethods(),但它也不包含在其中。

如果我可以访问 base-class 方法,那么我就可以调用它:

var methodInfo = fieldType
    .GetMethod('MyBaseMethod');

methodInfo
    .Invoke(fieldInstance, null);

问题: 如果每个字段实例的类型被列为接口,我如何设法在每个字段实例中调用我的 base-class 方法?

谢谢。

所以这里的问题是,您需要使用 field

中的实际 实例

例如

var methods = fieldInstance
    .GetType()
    .GetRuntimeMethods();

例子

给定一些人为设置的 类 和界面(试图复制您所描述的内容)

public interface ITest { }

public class SomeOtherClass : MyBaseClass, ITest { }

public class MyWorkingClass : MyBaseClass, ITest
{
   private readonly ITest _test;

   public MyWorkingClass(ITest test)
   {
      _test = test;
   }

   public void SomeMethod()
   {    
      MyBaseMethod(); 
   }
}

public class MyBaseClass
{
   public void MyBaseMethod()
   {
      var fields = GetType()
         .GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly)
         .ToList();

      foreach (var field in fields)
      {
         var fieldType = field.FieldType;

         var fieldInstance = field
            .GetValue(this);

         if (fieldInstance == null)
            return;
         var methods = fieldInstance
            .GetType()
            .GetRuntimeMethods();

         foreach (var item in methods)
            Console.WriteLine(item.Name);

      }  
   }
}

用法

var asd = new MyWorkingClass(new SomeOtherClass());
asd.SomeMethod();

输出

MyBaseMethod
GetType
MemberwiseClone
Finalize
ToString
Equals
GetHashCode

The words most convoluted example