2012-06-29 6 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;}}; 
} 

С деа каждого уровня иерархии классов, вызывающего его метод base.Name. Но снова мне теперь пришлось называть Базу дважды (по общему признанию, она не сработает во время компиляции, если я забуду), но она все еще кажется хрупкой.

ответ

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

u выиграть, потому что yr-решение не имеет «.object» на передней панели (в соответствии с «spec»). Оба рекурсивных ответа получают карму – 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" 

Edited предотвратить NullReferenceException

+0

я собирался принять этот ответ до I увидев, что Майклс ответил, он не применил «.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)); 

, который дает вам атр [0] == "B: A: Base"

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

Смежные вопросы