C#确定对象的类型
我不太清楚如何问好这个问题。对不起,如果不清楚的话。我试图确定对象的行为类型,而不是对象的实际类型 假设我有两门课:C#确定对象的类型,c#,C#,我不太清楚如何问好这个问题。对不起,如果不清楚的话。我试图确定对象的行为类型,而不是对象的实际类型 假设我有两门课: 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
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
有没有一种内在的方法可以做到这一点?我猜我可能可以在类型上编写一个扩展方法来实现我想要的功能
public static Type GetActualBaseType(this object obj)
{
Type type = obj.GetType();
while (type.IsNested)
type = type.BaseType;
return type;
}
你可以试着用它
您可以尝试使用该您可以使用
System.Diagnostics.StackTrace
获取堆栈帧,然后获取当前方法的DeclaringType
:
var st = new StackTrace();
Console.WriteLine(st.GetFrame(0).GetMethod().DeclaringType.ToString());
MethodBase.GetCurrentMethod().DeclaringType
您可以使用
System.Diagnostics.StackTrace
获取堆栈帧,然后获取当前方法的DeclaringType
:
var st = new StackTrace();
Console.WriteLine(st.GetFrame(0).GetMethod().DeclaringType.ToString());
MethodBase.GetCurrentMethod().DeclaringType
看看你现在得到的一些建议。在我的书里,有些东西有点臭 您要使用:
typeof(A).IsAssigneableFrom(aninstance.GetType());
要确定类型是否派生自basetype,或实现接口
请参阅:。本页有许多有趣的例子,展示了它所支持的所有微妙案例看看你现在得到的一些建议。在我的书里,有些东西有点臭 您要使用:
typeof(A).IsAssigneableFrom(aninstance.GetType());
要确定类型是否派生自basetype,或实现接口
请参阅:。这个页面有很多有趣的例子,展示了它支持的所有微妙的情况。你真的需要一个给定类实例的类型字符串,还是想知道如何处理某个基类的不同子类型 在后一种情况下,最好使用
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
}
}
我不知道这是否是您试图去的地方,但从您提出的问题和您的评论可以清楚地看出,仅仅获取基类的名称并不是真正的问题。您真的需要给定类实例的类型字符串,还是想知道如何处理某个基类的不同子类型 在后一种情况下,最好使用
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
}
}
我不知道这是否是您试图去的地方,但从您提出的问题和您的评论可以清楚地看出,仅仅获取基类的名称并不是真正的问题。您似乎在寻找的是编译时已知的: 在B中,您需要类型B 在A的ctor中,您希望类型A 因此,您可以简单地编写
typeof(A)
,typeof(B)
,等等
如果要通过声明当前方法的反射获取类型:
var st = new StackTrace();
Console.WriteLine(st.GetFrame(0).GetMethod().DeclaringType.ToString());
MethodBase.GetCurrentMethod().DeclaringType
您似乎在寻找的是编译时已知的: 在B中,您需要类型B 在A的ctor中,您希望类型A 因此,您可以简单地编写
typeof(A)
,typeof(B)
,等等
如果要通过声明当前方法的反射获取类型:
var st = new StackTrace();
Console.WriteLine(st.GetFrame(0).GetMethod().DeclaringType.ToString());
MethodBase.GetCurrentMethod().DeclaringType
在您的示例中,您可以使用
string thisTypeName=typeof(A)
如果您已经知道这类的类型(因为您在类的代码中),那么为什么要尝试从GetType()
这样的方法获取它呢?您到底想要哪种类型?所有类都继承类对象
,因此这将是任何类的“最基本”类。您想要不是对象的“最基本”类吗?您是否希望“最基本”类位于同一程序集中?在您的示例中,您可以使用string thisTypeName=typeof(A)
如果您已经知道该类的类型(因为您在该类的代码中),为什么要尝试从GetType()
这样的方法获取它?您到底想要哪种类型?所有类都继承类对象
,因此这将是任何类的“最基本”类。您想要不是对象的“最基本”类吗?是否希望在同一程序集中使用“most base”类?这是朝着正确方向迈出的一步,但我不一定总是希望使用“most base”类型。假设我在做这个。GetType()。???在构造器内部,将A改为B;在这种情况下,我需要这个.GetType()。???返回对类型B的引用。您实际想要什么?在OP中,你说你不想要“中间类型”,这是朝着正确方向迈出的一步,但我不一定总是想要“最基本”类型。假设我在做这个。GetType()。???在构造器内部,将A改为B;在这种情况下,我需要这个.GetType()。???返回对类型B的引用。您实际想要什么?在OP中,你说你不想在C中使用“中间类型”;它应该读为obj是Aaa
,或者obj是Aaa
,以执行动态强制转换,如果在C中不可能,则返回null;它应该读为obj是Aaa
,或者obj是Aaa
,以执行动态强制转换,如果不可能,则返回null