如何从另一个派生类中获取派生类的类型
本文关键字:派生 获取 类型 另一个 | 更新日期: 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
运算符正是用于此目的。
也可以使用具有类Type
的getType()
方法。
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);
}
}
要获取任何东西的运行时类型,首先需要一个对象实例来获取类型。所以在你给定的结构下,这是不可能的。
有两种可能的方法:
-
将
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 { } }
-
将类型直接传递给构造函数:
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所建议的),我个人更喜欢第二种方法,因为这不需要实际的实例。