我不太确定如何好好问这个问题。对不起,如果不清楚的话。我正在尝试确定对象的类型,而不是对象的实际类型。
说我有这两个类:
public class A{
public A() {
string thisTypeName = this.GetType().???; // the value I'm looking for here is "A" not "B"
}
}
public class B : A { }
我不想要的是......
string thisTypeName = this.GetType().BaseType.Name;
...因为如果我决定这样做......
public class C : B { }
...然后我的this.GetType()。BaseType将引用B类,而不是A.
有没有内置的方法来做到这一点?我猜我可能会在Type上编写一个扩展方法来做我想做的事。
答案 0 :(得分:4)
观看您现在获得的一些建议。其中一些在我的书中有点臭。
您想使用:
typeof(A).IsAssigneableFrom(aninstance.GetType());
确定某个类型是否来自基类型,或实现接口
请参阅:http://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx。这个页面有一些有趣的例子,展示了它支持的所有微妙案例
答案 1 :(得分:0)
public static Type GetActualBaseType(this object obj)
{
Type type = obj.GetType();
while (type.IsNested)
type = type.BaseType;
return type;
}
您可以尝试使用
答案 2 :(得分:0)
您可以使用System.Diagnostics.StackTrace
获取堆栈帧,然后获取当前方法的DeclaringType
:
var st = new StackTrace();
Console.WriteLine(st.GetFrame(0).GetMethod().DeclaringType.ToString());
答案 3 :(得分:0)
您真的需要给定类实例的类型字符串,还是想知道如何处理某个基类的不同子类型?
在后一种情况下,最好使用is
关键字,如下所示:
class A {}
class B : A {}
class C : B {}
class Aaa : A {}
// NB: order of if() statements is important below, start with most specific ones
public void doSomething(A obj) {
if(obj is Aaa) {
// do something specific for Aaa
} else if(obj is C) {
// do something specific for C
} else if(obj is B) {
// do something specific for B
} else {
// do general A stuff
}
}
我不知道这是否是您要去的地方,但是从您提出的问题和您的评论中可以清楚地看到,只是获取基类的名称并不是真正的问题。
答案 4 :(得分:0)
你在寻找的东西在编译时是已知的:
在B的ctor中你想要B型
在A的ctor中你想要A型......
所以你可以简单地写typeof(A)
,typeof(B)
等
如果你想通过声明当前方法的反射来获取类型:
MethodBase.GetCurrentMethod().DeclaringType