2012-06-29 42 views
1
class Base 
{ 
} 
class A: Base 
{ 
} 
class B:A 
{ 
} 

我希望能夠得到對於B字符串實例的字符串「Base.AB」試圖讓代表一類heirachy

當然,我可以簡單地做

class B:A 
{ 
    const string NAME = "Base.A.B"; 
} 

但是那一種脆弱的,如果我改變的事情,我必須改變它在很多地方

我開始了

class Base 
{ 
protected string Name {get{return typeof(Base).Name;}}; 
} 

使用每個類層次結構級別的dea來調用它的base.Name方法。但我現在不得不再次命名Base(如果我忘記了,它在編譯時會失敗),但它仍然看起來很脆弱。

回答

0

與其他人一樣的代碼,但我付出了努力,所以我會很好的發佈它(唯一的區別是我不想「.object」被卡在最後)。

public class Class1 { } 
    public class Class2 : Class1 { } 
    public class Class3 : Class2 { } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     Class3 c3 = new Class3(); 
     Console.WriteLine(TypeToString(c3.GetType())); 
    } 

    private string TypeToString(Type t) 
    { 
     if (t == null) 
      return ""; 
     if ((t.BaseType == null) || (t.BaseType == typeof(object))) 
      return t.Name; 
     return TypeToString(t.BaseType) + "." + t.Name; 
    } 
+0

你贏了,因爲年終解決方案沒有'.object'(按照'規範')。遞歸答案都可以得到業力 – pm100

1

如何:

class Base { 
    public virtual string GetName() { return "Base"; } 
} 

class A : Base { 
    public override string GetName() { return base.GetName() + ".A"; } 
} 

class B : A { 
    public override string GetName() { return base.GetName() + ".B"; } 
} 

只是一個想法:)

3

這種方法:

public static string GetHierarchy(Type t) 
{ 
    if (t == null) 
    { 
     return ""; 
    } 

    string rec = GetHierarchy(t.BaseType); 

    return rec + "." + t.Name.ToString(); 
} 

當這樣調用:

string str = GetHierarchy(typeof(B)); 

將產生如下結果:

".Object.Base.A.B" 

編輯,以防止NullReferenceException異常

+0

我會接受這個答案,直到我看到邁克爾斯的回答,他沒有在結果字符串上加上'.object'。但兩者都得到++的清潔解決方案 - tx – pm100

0

你可能會考慮使用反射。

您可以批註像

[Name("Base")] 
public class Base { } 

[Name("A:Base")] 
public class A : Base { } 

[Name("B:A:Base")] 
public class B : A { } 

你的類然後你可以使用例如:

System.Attribute[] attrs = System.Attribute.GetCustomAttributes(typeof(B)); 

,讓你ATTR [0] == 「B:A:基地」

0

這是建立客@海梅的答案,所以我會給他大部分的功勞,但我修改它,這樣你就不必把在需要你記得更新他們的自定義屬性。

*您需要添加一個引用的System.Reflection

class Base 
{ 
    public virtual string GetName() 
    { 
     return MethodBase.GetCurrentMethod().DeclaringType.ToString(); 
    } 
} 

class A : Base 
{ 
    public override string GetName() 
    { 
     return base.GetName() + "." + MethodBase.GetCurrentMethod().DeclaringType.ToString(); 

    } 
} 

class B : A 
{ 
    public override string GetName() 
    { 
     return base.GetName() + "." + MethodBase.GetCurrentMethod().DeclaringType.ToString(); 
    } 
} 

class C : B 
{ 
    public override string GetName() 
    { 
     return base.GetName() + "." + MethodBase.GetCurrentMethod().DeclaringType.ToString(); 
    } 
} 

C test = new C(); 
test.GetName(); // Yields "Base.A.B.C" 
0

我已經寫了下面的擴展方法和遞歸方法。 我相信它爲這個問題提供了一個很好的解決方案。

檢查出來,任何反饋將是很好=)

public static class FamilyTreeExtension 
    { 
     public static string GetFamilyTree(this Type t) 
     { 
      return GetFamilyTreeRecursive(t, t.Name); 
     } 

     public static string GetFamilyTreeRecursive(Type t, string leaf) 
     { 
      Type baseType = t.BaseType; 

      string currentTree; 

      if (baseType != null) 
      { 
       currentTree = string.Format("{0}.{1}", baseType.Name, leaf); 
       return GetFamilyTreeRecursive(baseType, currentTree); 
      } 
      else 
      { 
       return leaf; 
      } 
     } 
    } 

用法:

... 
private void reflectionTryOut() 
     { 
      string validate = typeof(C).GetFamilyTree(); 
     } 
    } 

    public class A 
    {} 

    public class B : A 
    {} 

    public class C : B 
    {} 

結果:Object.ABC