C#确定对象的类型

时间:2011-04-18 22:45:54

标签: 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 = this.GetType().BaseType.Name;

...因为如果我决定这样做......

public class C : B { }

...然后我的this.GetType()。BaseType将引用B类,而不是A.

有没有内置的方法来做到这一点?我猜我可能会在Type上编写一个扩展方法来做我想做的事。

5 个答案:

答案 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