获取对称为虚方法的类的引用

时间:2018-03-27 20:27:03

标签: c# reflection

是否可以从抽象类中定义的方法中获取对调用虚方法的类的引用?

基本上,我有一个抽象类,让我们说BaseAction,它包含一个名为RetrieveData的虚方法:

public abstract class BaseAction
{
    protected virtual void RetrieveData()
    {

    }
}

在实现中,我将这个虚方法作为Action传递给一个方法,为此产生了一些效果:

public class Action: BaseAction
{
    public Action()
    {
        ActionStatement(RetrieveData);
    }
}

可以在RetrieveData方法中获取对Action类的引用,而不必在Action类中覆盖它,这样做会产生这样的效果:

public abstract class BaseAction
{
    protected virtual void RetrieveData()
    {
        // using reflection to get a handle on instance of Action?
    }
}

原因是,我想在各种不同类型的类中使用这个虚方法,每个类都有一个需要修改的ID字段,但我不想覆盖这个虚方法20多个动作类中的每一个,只是为了更改ID字段。

我希望在基类中发生这种情况,以限制代码重复的数量。

2 个答案:

答案 0 :(得分:0)

你不需要反思这一点。你有很多选择:

如果ID字段在每个实现的类中都是通用的,只需在抽象类中声明它并更改RetrieveData()方法中的值。

public abstract class BaseAction
{
    protected int ID;
    protected virtual void RetrieveData()
    {

    }
}

如果ID字段在所有已实现的类中不常见,则可以添加抽象方法并使用该方法访问ID属性。

public abstract class BaseAction
{
    protected abstract ChangeID(int value);
    protected virtual void RetrieveData()
    {
        //Do your stuff

        ChangeID(<with-new-value>);
    }
}

public class Action: BaseAction
{
    Protected override ChangeID(int value)
    {
        //Do whatever you want
    }

    public Action()
    {
        ActionStatement(RetrieveData);
    }
}

答案 1 :(得分:0)

如果您这样做:

public abstract class BaseAction
{
    protected void Foo()
    {
        Console.WriteLine(this.GetType());
    }
}

public class Action : BaseAction 
{
    public void Bar() 
    {
        Foo();
    }
}

// the runtime type of foo will be Action regardless of compile-time type
BaseAction foo = new Action(); 
foo.Bar();

它将输出Action - 也就是说,在继承的方法(Foo())中,如果方法最终,对象this将已经是继承类型Action通过运行时类型Action的对象调用。

(暂时忽略类似方法或显式接口实现的new修饰符。)