2013-11-25 31 views
0

的我有,我想獲取類型名出的類層次:全名通用基類型

class Alice 
    :ThirdPersonCharacter<Foo, Bar> 

class ThirdPersonCharacter<A, B> 
    :BaseHumanoidCharacter<A, B>, ISomeInterface 
    where A : Something 

class BaseHumanoidCharacter<A, B> 
    : Entity, 
    ISomeOtherInterface 
    where A : Something 

我想所有的基本類型愛麗絲的,所以我這樣做:

private static IEnumerable<Type> BaseTypes(Type t) 
{ 
    while (t.BaseType != null) 
    { 
     yield return t.BaseType; 
     t = t.BaseType; 
    } 
} 

var aliceTypes = baseTypes(typeof(Alice)).Select(a => a.AssemblyQualifiedName).ToArray(); 

問題是這樣的是找到BaseHumanoidCharacter類型是:

{Name = "BaseHumanoidCharacter`2" FullName = null} 
當然

我真正想要的是:

{Name = "BaseHumanoidCharacter`2[[X.Y.Z.Foo, AssemblyName, version=123, Culture=whatever, PublicKey=stuff],[X.Y.Z.Bar, AssemblyName, version=123, Culture=whatever, PublicKey=stuff]]", FullName = "Something that isn't null"} 

有沒有辦法修改這個系統給我有用的類型與他們的通用參數填寫,他們的FullName不爲空?

+0

爲了全面瞭解您的類層次結構會有所幫助,如果您還顯示,愛麗絲源自Character類 - 或者是一個錯字? – Markus

+0

是的,對不起。我的意思是更具體的ThirdPersonCharacter。 – Martin

回答

0

FullName回報的東西很喜歡你要找的東西:

typeof(Tuple<int, string>).FullName 
// System.Tuple`2[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] 

有可能會或可能不會取決於你打算如何使用它

這事和你的榜樣,之間的一些差異
  1. 它包含第一個類型的命名空間。您可以通過根據Namespace的長度獲取子字符串來解決此問題。
  2. 它不僅包含程序集名稱,還包含完整程序集標識字符串(Version,Culture,PublicKeyToken),使其非常長。
  3. 格式有點不同,在類型周圍還有一對額外的[]括號。

如果最後兩個是有問題的,你應該能夠使用的Type各種屬性(GenericTypeArgumentsNameFullName等)和Assembly,與Splitting結合在需要的地方建立自己的字符串(如分離來自其他信息的程序集名稱)。

這裏的選擇NameFullName的例子:

var aliceTypes = BaseTypes(typeof(Alice)).Where(x => x == 
          typeof(BaseHumanoidCharacter<Foo, Bar>)) 
          .Select(a => new { a.Name, a.FullName }).ToArray(); 
Console.WriteLine(aliceTypes.Single()); 
+0

糟糕,格式差異僅僅是我的錯誤。我會在問題中糾正這一點。真正的問題是FullName是*不*返回一個像這樣的字符串(這是我所期望的),由於某種原因,在這種情況下它返回null。我期望這是關於整個系統設置的具體方式,爲什麼我給出了整個類層次結構的例子。 – Martin

+0

更具體地說,我懷疑使用BaseType是不對的,但我不確定使用什麼替代方法。 – Martin

+0

@Martin'BaseType'很好。我無法重現您顯示'null'的問題。查看http://ideone.com/K60q3Z的輸出 –