1
class Base
{
}
class A: Base
{
}
class B:A
{
}

B のインスタンスに対して文字列「Base.AB」を取得できるようにしたい

もちろん、私は単に行うことができます

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

しかし、それはちょっと壊れやすいものです。何かを変えると、多くの場所を変えなければなりません。

私はから始めました

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

各クラス階層レベルの dea で、その base.Name メソッドを呼び出します。しかし、ここでも Base に 2 回名前を付ける必要がありました (確かに、忘れるとコンパイル時に失敗します) が、それでも壊れやすいようです。

4

6 に答える 6

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を防ぐために編集

于 2012-06-29T00:28:48.280 に答える
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"; }
}

ただのアイデア:)

于 2012-06-29T00:22:04.387 に答える
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:Base"が得られます

于 2012-06-29T00:29:28.250 に答える
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;
    }
于 2012-06-29T00:32:14.583 に答える
0

これは@Jaimeの回答に基づいているため、彼にほとんどのクレジットを与えますが、更新を忘れないようにする必要があるカスタム属性を配置する必要がないように変更しました。

* 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"
于 2012-06-29T00:50:32.630 に答える
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

于 2012-06-29T00:56:23.497 に答える