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