C# 有没有一种方法可以使继承列表中的类的名称具有字符串默认值

C# 有没有一种方法可以使继承列表中的类的名称具有字符串默认值,c#,C#,不太清楚这个词怎么说,但我有几个类,如下所示 public class Item { string itemPath; string prefabID; void Initialize() { itemPath = classnames + prefabID; } } public class Equippable : Item public class Weapon : Equippable public class MeleeWe

不太清楚这个词怎么说,但我有几个类,如下所示

public class Item
{
    string itemPath;
    string prefabID;

    void Initialize()
    {
        itemPath = classnames + prefabID;
    }
}


public class Equippable : Item
public class Weapon : Equippable
public class MeleeWeapon : Weapon
我希望每个字符串以自己的类名结尾,以基类名称开头,并且在每个名称之间有一个“/”

只是希望这样做作为一种存储每个项目的方式预制路径

因此,希望Equipable将其字符串作为

项目/装备/预制ID

武器是

项目/装备/武器/预制ID

对于每个派生类,依此类推

有什么建议或解决方法吗?

试试这个:

void Initialize()
{
    var segs = new List<string>();
    var type = GetType();
    while (type != null && type != typeof(object))
    {
        segs.Insert(0, type.Name);
        type = type.BaseType;
    }

    segs.Add(prefabID);

    itemPath = string.Join("/", segs);
}
void Initialize()
{
var segs=新列表();
var type=GetType();
while(type!=null&&type!=typeof(对象))
{
segs.Insert(0,type.Name);
type=type.BaseType;
}
segs.Add(预置ID);
itemPath=string.Join(“/”,segs);
}
试试这个:

void Initialize()
{
    var segs = new List<string>();
    var type = GetType();
    while (type != null && type != typeof(object))
    {
        segs.Insert(0, type.Name);
        type = type.BaseType;
    }

    segs.Add(prefabID);

    itemPath = string.Join("/", segs);
}
void Initialize()
{
var segs=新列表();
var type=GetType();
while(type!=null&&type!=typeof(对象))
{
segs.Insert(0,type.Name);
type=type.BaseType;
}
segs.Add(预置ID);
itemPath=string.Join(“/”,segs);
}

您可以递归地遍历所有基类型,并将此路径构建到itemPath中

下面是实现,下面是输出

我认为字段prefableID稍后将由您填充,因此无论何时调用getPrefableID(),它都将返回itemPath+prefableID

public class Item
{
    string itemPath;
    string prefabID;

    public string GetPrefabID()
    {
        return itemPath + "/" + prefabID;
    }

    public Item()
    {
        Initialize();
    }

    void Initialize()
    {
        itemPath = GetPrefabPath() + prefabID;
        prefabID = Guid.NewGuid().ToString();
    }

    string GetPrefabPath()
    {
        StringBuilder prefabricatedPath = new StringBuilder(GetType().Name);
        Type baseType = GetType().BaseType;
        while (baseType != typeof(object))
        {
            prefabricatedPath.Insert(0, baseType.Name + "/");
            baseType = baseType.BaseType;
        }
        return prefabricatedPath.ToString();
    }
}


public class Equippable : Item { };
public class Weapon : Equippable { };
public class MeleeWeapon : Weapon { };

static void Main(string[] args)
{
    Console.WriteLine("prefabID for Item: {0}", new Item().GetPrefabID());
    Console.WriteLine("prefabID for Equippable: {0}", new Equippable().GetPrefabID());
    Console.WriteLine("prefabID for Weapon: {0}", new Weapon().GetPrefabID());
    Console.WriteLine("prefabID for MeleeWeapon: {0}", new MeleeWeapon().GetPrefabID());

    Console.ReadLine();
}
输出:

prefabID for Item: Item/c4fb4f63-f7f1-4c83-9d01-26881bb5e014
prefabID for Equippable: Item/Equippable/858791ea-d10d-4560-b8e4-202d91625088
prefabID for Weapon: Item/Equippable/Weapon/0bcba546-df85-4fed-ab68-5a1e012df5d
prefabID for MeleeWeapon: Item/Equippable/Weapon/MeleeWeapon/75e60a6d-854a-4d07
b20b-a709699bb3d7

您可以递归地遍历所有基类型,并将此路径构建到itemPath中

下面是实现,下面是输出

我认为字段prefableID稍后将由您填充,因此无论何时调用getPrefableID(),它都将返回itemPath+prefableID

public class Item
{
    string itemPath;
    string prefabID;

    public string GetPrefabID()
    {
        return itemPath + "/" + prefabID;
    }

    public Item()
    {
        Initialize();
    }

    void Initialize()
    {
        itemPath = GetPrefabPath() + prefabID;
        prefabID = Guid.NewGuid().ToString();
    }

    string GetPrefabPath()
    {
        StringBuilder prefabricatedPath = new StringBuilder(GetType().Name);
        Type baseType = GetType().BaseType;
        while (baseType != typeof(object))
        {
            prefabricatedPath.Insert(0, baseType.Name + "/");
            baseType = baseType.BaseType;
        }
        return prefabricatedPath.ToString();
    }
}


public class Equippable : Item { };
public class Weapon : Equippable { };
public class MeleeWeapon : Weapon { };

static void Main(string[] args)
{
    Console.WriteLine("prefabID for Item: {0}", new Item().GetPrefabID());
    Console.WriteLine("prefabID for Equippable: {0}", new Equippable().GetPrefabID());
    Console.WriteLine("prefabID for Weapon: {0}", new Weapon().GetPrefabID());
    Console.WriteLine("prefabID for MeleeWeapon: {0}", new MeleeWeapon().GetPrefabID());

    Console.ReadLine();
}
输出:

prefabID for Item: Item/c4fb4f63-f7f1-4c83-9d01-26881bb5e014
prefabID for Equippable: Item/Equippable/858791ea-d10d-4560-b8e4-202d91625088
prefabID for Weapon: Item/Equippable/Weapon/0bcba546-df85-4fed-ab68-5a1e012df5d
prefabID for MeleeWeapon: Item/Equippable/Weapon/MeleeWeapon/75e60a6d-854a-4d07
b20b-a709699bb3d7

哦太晚了。噢。。太晚了。英雄联盟