如何从主叫方班级获得孩子的班级名称

时间:2019-06-16 09:59:31

标签: c# inheritance system.reflection

我有五个班级

class Program
{
    static void Main(string[] args)
    {
        Abstract test = new Child();
        test.Exectue();
    }
}


public abstract class Abstract
{
    public void Exectue()
    {
        IStrategy strategy = new Strategy();
        strategy.GetChildClassName();
    }
}


public class Child : Abstract
{
}


public interface IStrategy
{
    void GetChildClassName();
}


public class Strategy : IStrategy
{
    public void GetChildClassName()
    {
        ???
        Console.WriteLine();
    }
}

我的问题是,如何从策略类中获取子类的名称(即测试变量的实例)。

执行this.GetType().Name会产生“策略”,并且

var mth = new StackTrace().GetFrame(1).GetMethod();
var cls = mth.ReflectedType.Name; 

产生“摘要”,这不是我想要的。

有什么方法可以获取Child类的名称而无需进行一些怪异的麻烦,例如抛出异常或传递类型。

2 个答案:

答案 0 :(得分:1)

我不知道这是否可以满足您的需求,但是您可以将Abstract类的当前实例发送到Strategy类的构造函数,然后获取当前的实型名称。

或者,如果您只想发送类的名称而不是整个实例,您也可以这样做。

更新为代码

public abstract class Abstract
{
    public void Execute()
    {
        IValidator validator = new CustomClassValidator(this.GetType().Name);
        validator.Validate();
    }
}

public interface IValidator
{
    void Validate();
}


public class CustomClassValidator : IValidator
{
    private string className;

    public CustomClassValidator(string className)
    {
        this.className = className;
    }

    public void Validate()
    {
        // make some other validations and throw exceptions
        Console.WriteLine(className);
    }
}

答案 1 :(得分:0)

public interface IStrategy
    {
      string GetChildClassName();
    }

public class Strategy : IStrategy``
    {
public string GetChildClassName()
     {
    return this.GetType().Name;
     }
    }