首页 文章

如何使用GetType访问C#中派生类的方法/属性?

提问于
浏览
1

我有两个派生类,Dog和Bird,它们派生自一个基类Animal .

Dog有一个属性Kennel,而Bird有一个属性Nest .

我想要一个方法(在一个单独的静态类中),它可以接收Animal类的实例,检查类型,然后调用其他方法将Kennel或Nest作为参数传递给它们,例如:

if (MyAnimal.GetType = Dog)
{MyKennelMethod(MyAnimal.Kennel)}
else if (MyAnimal.GetType = Bird)
{MyNestMethod(MyAnimal.Nest)}

我猜这不起作用 . 当你只有基类时,有没有办法访问派生类的属性?如果可能的话,我宁愿不要使用单独的抽象方法来混淆Dog和Bird类,因为我更喜欢使用单独的静态类来处理所有方法 . 我也希望它易于扩展,所以我可以拥有数百种不同的新动物来自动物 .

对于代码语法上的任何错误,我很抱歉,目前我还没有编辑器 .

4 回答

  • 2

    我想Kennel,Nest和将它们作为params的方法有一些共同点,对吧?如果是这样,我建议界面:

    interface SweetHome
    { 
        // members
    }
    
    class Dog: Animal
    {
        public SweetHome Kennel { get; set; }
    }
    
    class Bird: Animal
    {
        public SweetHome Nest { get; set; }
    }
    

    这可以满足您的需求 . 但我仍然认为方法应该位于派生自Animal的类中,而不是位于外部的某些静态类中 .

  • 0

    你必须施放:

    void SomeMethod(Animal animal)
    {
        var dog = animal as Dog;
        var bird = animal as Bird;
    
        if (dog != null)
        {
            // it's a dog - do whatever you want with the dog
        }
    
        if (bird != null)
        {
            // it's a bird - do whatever you want with the bird
        }
    }
    

    然而,这是一种代码味道 . 设计类可能有更好的方法,因此不需要这种类型的转换 . 例如, Animal 可能会公开 Home 属性,当它是 Dog 时返回 Kennel ,当它是 Bird 时返回 Nest . 或者也许你的静态方法只需要 Dog 然后有一个需要 Bird 的重载 .

  • 3

    好没问题 .

    Dog dog = myAnimal as Dog;
    Bird bird = myAnimal as Bird;
    if (dog != null)
       KennelMethod(dog.Kennel);
    else if (bird != null)
       NestMethod(bird.Nest);
    

    但是,我建议首先避免这种情况 . 如果你有一个方法需要一个动物,但真的需要一只狗或一只鸟,那么听起来你真的想要两个方法,一个拿狗,一个拿鸟 .

    如果可能的话,我宁愿不用个别的抽象方法来混淆Dog and Bird课程 . 我也希望它易于扩展,所以我可以拥有数百种不同的新动物来自动物 .

    你的要求有些矛盾;您不希望在类型代码本身中编码有关类型层次结构的信息,因此这些内容必须在类型层次结构之外,因此您有可伸缩性问题 .

    您是否考虑过使用访客模式?这是在对象的运行时类型上进行虚拟分派的一种相当标准的方法,但实际执行的代码存在于类外部 .

  • 4

    你总是可以施放动物物体 . 但我不建议以这种方式实现它,请阅读下文 .

    public static void DoSomething(Animal animal)
    {
        if (animal is Dog)
        {
          MyKennelMethod((animal as Dog).Kennel);
        }
        else if (animal is Bird)
        {
          MyNestMethod((animal as Bird).Nest);
        }
    }
    

    这种方法打破了继承的目的 . 正确的方法是在父对象(动物)中公开一个公共属性 . 这是一个非常简单的例子 . 您可以为Home定义一个公共类型,每个子对象以不同的方式公开它:

    public abstract class Animal
    {
        public abstract string Home;
    }
    
    public class Dog : Animal
    {
       public override string Home = "Kennel";
    }
    
    public class Bird : Animal
    {
       public override string Home = "Nest";
    }
    

相关问题