2013-11-25 32 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的输出 –