2011-04-18 62 views
1

的類型。對不起,如果不清楚。我試圖確定一個對象作爲,而不是實際的類型的對象的類型。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.

是否有一個內置的方式做到這一點?我猜我可能可以寫上類型的擴展方法,將做我想做的。

+0

在您的例子,你可以只使用'字符串thisTypeName = typeof(A)' – 2011-04-18 22:47:48

+0

如果你已經知道_this_的類型(因爲你在類的代碼中),你爲什麼試圖從'GetType()'這樣的方法獲得它? – 2011-04-18 23:06:40

+0

你想要的是哪種類型?所有類都繼承「Object」類,因此它將成爲任何類的「最基礎」類。你想要不是「對象」的「最基礎」類嗎?你想在同一個程序集中的「最基礎」類嗎? – Guffa 2011-04-18 23:21:32

回答

0
public static Type GetActualBaseType(this object obj) 
    { 
     Type type = obj.GetType(); 

     while (type.IsNested) 
      type = type.BaseType; 

     return type; 
    } 

,你可以嘗試使用

+0

這是朝正確方向邁出的一步,但我不一定總是想要「最基礎」類型。說我正在做這個.GetType()。裏面的構造函數B而不是A;在這種情況下,我想這個.GetType()。?返回對B型的引用。 – Tbabs 2011-04-18 22:57:03

+0

你究竟想要什麼?在OP中,你說你不想在C#中使用「中間類型」 – bevacqua 2011-04-18 23:01:13

0

你可以使用System.Diagnostics.StackTrace獲取堆棧幀,然後拿到​​當前方法:

var st = new StackTrace(); 
Console.WriteLine(st.GetFrame(0).GetMethod().DeclaringType.ToString()); 
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 
    } 
} 

我不知道,如果這是你試圖去,但這個問題你提出和你評論很明顯,獲取基類的名字並不是真正的問題。

+0

,它應該讀取'obj是Aaa'或'obj作爲Aaa'來執行動態強制轉換,如果不可能的話將返回null – sehe 2011-04-18 23:24:57

0

你彷彿在尋找在編譯時已知:

在B的構造函數需要的B型

在A的構造函數需要的A型...

所以你可以簡單的寫typeof(A)typeof(B)

如果你想獲得通過反射該聲明當前方法的類型

MethodBase.GetCurrentMethod().DeclaringType 
相關問題