A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 亚伦 中级黑马   /  2014-5-1 13:10  /  1876 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

评分

参与人数 1技术分 +1 收起 理由
czwanglei + 1

查看全部评分

11 个回复

正序浏览
亚伦 中级黑马 2014-5-10 17:36:06
9#
鲤鱼 发表于 2014-5-10 17:29
不知道你出于什么目的想要实现这种功能

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

点评

这个有问题能解决就是学习,,我觉得---呵呵  发表于 2014-5-10 20:14
回复 使用道具 举报
亚伦 中级黑马 2014-5-10 17:34:58
8#
袁晓俊 发表于 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

点评

不错,学到了,感谢,,,,我qq:1181567882,加个好友哦。  发表于 2014-5-10 20:13

评分

参与人数 1技术分 +1 收起 理由
czwanglei + 1

查看全部评分

回复 使用道具 举报
鲤鱼 中级黑马 2014-5-10 17:29:55
7#
不知道你出于什么目的想要实现这种功能{:3_68:}
回复 使用道具 举报
如果非要得到全部子类的类名的话,我能做的只有定义一个动态数组,然后在没生成一个子类的时候将其类名传递出来并赋值到之前定义的数组中,最后得到的数组通过遍历输出就可以展示出所有子类的类名了。这个是土办法。你如有发现直接得到子类的类名的方法的也分享一下哦。
回复 使用道具 举报
搞了半天,没有发现能直接通过父类直接得到子类的类名的方法,不过可以通过子类得到父类的类名,
你可以运行试一下,我刚刚写的。

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();

        }
    }


}


评分

参与人数 1技术分 +1 收起 理由
czwanglei + 1

查看全部评分

回复 使用道具 举报
袁晓俊 发表于 2014-5-9 12:59
string typeName = this.GetType().ToString();//空间名.类名

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

袁晓俊黑马,好厉害的哦。:kiss:
回复 使用道具 举报
袁晓俊 发表于 2014-5-9 12:59
string typeName = this.GetType().ToString();//空间名.类名

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

可能是我没说明清楚,我的意思是,可不可以只通过基类名(string),就找出所有派生自该基类的所有类的名字(string[]或其他),你这个我看得不太懂,说详细一点。
回复 使用道具 举报
string typeName = this.GetType().ToString();//空间名.类名

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

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

点评

试试这个,看看能不能得到你要的结果  发表于 2014-5-9 13:00

评分

参与人数 1技术分 +1 收起 理由
czwanglei + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马