如何调用注入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
(我无法为这个没有拖延的问题想出一个简洁的标题。)
我有一个基础 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