黑马程序员技术交流社区

标题: 如何获得所有继承自某类的类名 [打印本页]

作者: 亚伦    时间: 2014-5-1 13:10
标题: 如何获得所有继承自某类的类名
本帖最后由 亚伦 于 2014-5-10 17:45 编辑
  1. class Animal { }
  2.     class Dog : Animal { }
  3.     class Cat : Animal { }
复制代码
如上面代码,假如我定义了很多继承自Animal的类,我希望获得这些继承自Animal的类的类名(如Dog、Cat),有什么简单快捷的方式实现?

作者: 袁晓俊    时间: 2014-5-9 12:59
string typeName = this.GetType().ToString();//空间名.类名

string typeName = this.GetType().Name;//类名

new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name 方法名


作者: 亚伦    时间: 2014-5-10 14:22
袁晓俊 发表于 2014-5-9 12:59
string typeName = this.GetType().ToString();//空间名.类名

string typeName = this.GetType().Name;// ...

可能是我没说明清楚,我的意思是,可不可以只通过基类名(string),就找出所有派生自该基类的所有类的名字(string[]或其他),你这个我看得不太懂,说详细一点。
作者: 一片白    时间: 2014-5-10 14:34
袁晓俊 发表于 2014-5-9 12:59
string typeName = this.GetType().ToString();//空间名.类名

string typeName = this.GetType().Name;// ...

袁晓俊黑马,好厉害的哦。:kiss:
作者: 袁晓俊    时间: 2014-5-10 16:50
搞了半天,没有发现能直接通过父类直接得到子类的类名的方法,不过可以通过子类得到父类的类名,
你可以运行试一下,我刚刚写的。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
         public   class Father
        {
            public void  getName( )
            {

            }
        }
         public  class Son : Father
        {
           public void sonGetName()
           {

           }
        }

         public class Daughter : Father
         {
             public void sonGetName()
             {
             }
         }

        static void Main(string[] args)
        {
            Father A = new Father();
            Son B = new Son();
            string name = B.GetType().BaseType.Name ;
            Console.WriteLine("通过子类的对象B访问父类的类名:"+name);
            Console.ReadKey();

        }
    }


}



作者: 袁晓俊    时间: 2014-5-10 16:54
如果非要得到全部子类的类名的话,我能做的只有定义一个动态数组,然后在没生成一个子类的时候将其类名传递出来并赋值到之前定义的数组中,最后得到的数组通过遍历输出就可以展示出所有子类的类名了。这个是土办法。你如有发现直接得到子类的类名的方法的也分享一下哦。
作者: 鲤鱼    时间: 2014-5-10 17:29
不知道你出于什么目的想要实现这种功能{:3_68:}
作者: 亚伦    时间: 2014-5-10 17:34
袁晓俊 发表于 2014-5-10 16:54
如果非要得到全部子类的类名的话,我能做的只有定义一个动态数组,然后在没生成一个子类的时候将其类名传递 ...

无论怎样,先感谢你的回复。下面是我在网上找到的解决方法,附上我对这段代码的理解
  1. class Program
  2.     {
  3.         public class Base { }
  4.         public class Sub1 : Base { }
  5.         public class Sub2 : Base { }
  6.         public class Sub3 : Sub1 { }

  7.         static void Main(string[] args)
  8.         {
  9.             var subTypeQuery = from t in Assembly.GetExecutingAssembly().GetTypes()
  10.                                where IsSubClassOf(t, typeof(Base))
  11.                                select t;

  12.             foreach (var type in subTypeQuery)
  13.             {
  14.                 Console.WriteLine(type);
  15.             }
  16.         }

  17.         static bool IsSubClassOf(Type type, Type baseType)
  18.         {
  19.             var b = type.BaseType;
  20.             while (b != null)
  21.             {
  22.                 if (b.Equals(baseType))
  23.                 {
  24.                     return true;
  25.                 }
  26.                 b = b.BaseType
  27.             }
  28.             return false;
  29.         }
  30.     }
复制代码
其实原理很简单。我们知道,可以通过Type对象.BaseType获取这个Type对象的基类型。那么首先通过Assembly.GetExecutingAssembly().GetTypes()获取当前程序集的所有类型的Type,然后只需要将所有这些Type对象的基类型逐个跟一个指定的Type比较,就可以找到所有派生自这个指定的Type的Type。
这个是代码出处http://www.cnblogs.com/TianFang/archive/2009/10/24/1588949.html

作者: 亚伦    时间: 2014-5-10 17:36
鲤鱼 发表于 2014-5-10 17:29
不知道你出于什么目的想要实现这种功能

用蒋坤老师的风格来说,应该就是为了好玩吧。。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2