如何从另一个派生类中获取派生类的类型

本文关键字:派生 获取 类型 另一个 | 更新日期: 2023-09-27 18:21:54

我有(伪)代码:

public class GlobalClass
{
    public GlobalClass()
    {
        var x = this.GetType().Name // Returns "Channels"
        // WHAT TO DO HERE?
    }
}
public class BaseClass
{
    public string Title { get; set; }
}

使用这个代码:

public class Channels : GlobalClass
{
    public Channels()
    {
    }
    public class Channel : BaseClass
    {
    }
}

注释在哪里(//这里该怎么办?),我想获得BaseClass的运行时类型,在我的示例代码中,应该返回Channel

我对不同的方法持开放态度,但前提是它能解释为什么我应该更改代码。

如何从另一个派生类中获取派生类的类型

我认为这里需要一个泛型类,类似于:

    public class GlobalClass<T> where T : BaseClass
    {
        public GlobalClass()
        {
            var theType = typeof(T);    //you got it
        }
    }
    public class BaseClass
    {
        public string Title { get; set; }
    }
    public class Channel : BaseClass { }
    public class Channels : GlobalClass<Channel> { }

您可以像这样使用反射:

using System.Reflection;

public class GlobalClass
{
    public GlobalClass()
    {
        Type[] types = Assembly.GetExecutingAssembly ().GetTypes ();
        foreach ( Type t in types )
        {
            if ( t.BaseType == typeof ( BaseClass ) )
            {
                Console.WriteLine ( "I found a class " + t.Name + " that subclass BaseClass" );
            }
        }
    }
}

另请参阅堆栈溢出问题程序集中的类列表

is运算符正是用于此目的。

也可以使用具有类TypegetType()方法。

class Example 
{
    static void ShowTypeInfo (object o) 
    {  
        Console.WriteLine ("type name = {0}, 
                            full type name = {1}", o.GetType(), 
                            o.GetType().FullName ); 
    }
    public static void Main()
    { 
        long longType = 99; 
        Example example= new Example(); 
        ShowTypeInfo (example); 
        ShowTypeInfo (longType); 
    }
}

要获取任何东西的运行时类型,首先需要一个对象实例来获取类型。所以在你给定的结构下,这是不可能的。

有两种可能的方法:

  1. BaseClass参数添加到GlobalClass:的构造函数中

    public class GlobalClass
    {
        public GlobalClass(BaseClass data)
        {
            var dataType = data == null ? null : data.GetType();
            // do something with the type
        }
    }
    public class Channels : GlobalClass
    {
        public Channels(Channel data) : base(data)
        {
        }
        public class Channel : BaseClass
        {
        }
    }
    
  2. 将类型直接传递给构造函数:

    public class GlobalClass
    {
        public GlobalClass(Type actualType)
        {
            Debug.Assert(typeof(BaseClass).IsAssignableFrom(actualType));
        }
    }
    public class Channels : GlobalClass
    {
        public Channels() : base(typeof(Channel))
        {
        }
        public class Channel : BaseClass
        {
        }
    }
    

如果由于某种原因,结构不允许使用泛型(正如Danny Chen所建议的),我个人更喜欢第二种方法,因为这不需要实际的实例。