从一个类中返回所有字段

3
我正在尝试循环遍历类中的字段,将特定类型的字段放入列表中,然后返回该列表。我知道我缺少一些关键组件,但我无法弄清楚我做错了什么。到目前为止,我的做法如下:
...
我需要返回实际字段的指针列表,而不是数据的副本。如果能帮我解决这个问题,我将不胜感激。
我删除了上面的代码 (你仍然可以在历史记录中看到它),因为它很令人困惑。以下是经过更新的代码(删除了一些额外的内容),由于有了competent_tech的回答,它现在能够正常工作:
string prop1;
BaseClass prop2;
SubClass prop3;
SubClass prop4;

public List<BaseClass> GetData()
{
    List<BaseClass> DataList = new List<BaseClass>();

    foreach (System.Reflection.PropertyInfo thisInfo in this.GetType().GetProperties())
    {
        var tempPropery = thisInfo.GetValue(this, null);
        if (tempPropery.GetType().IsSubclassOf(typeof(BaseClass)) || tempPropery.GetType().Equals(typeof(BaseClass)))
        {
            DataList.Add((BaseClass)tempPropery);
        };
    }

    return DataList;
}

以上代码将允许您从类中获取特定基类型的所有属性,并将它们返回到一个列表中。因此,以上代码将返回prop2-prop4。

1
我会使用 Dictionary<string,PrimaryAbility>。这样,你可以通过以下方式获取 STRvar str = AllAbilities["STR"];。经常需要反射通常意味着你应该重构你的代码。 - Tim Schmelter
我正在寻找一种简单(但在开始时很复杂)的方法,可以返回所有能力(其他类使用相同的结构),而不必每次添加新内容时都添加额外的代码行。 - Anthony Nichols
2个回答

2
您可以通过反射来实现这一点。
foreach (System.Reflection.PropertyInfo oProperty in this.GetType().GetProperties()) {
}

一旦获得信息或过滤属性(例如,通过向要收集的属性添加属性),您可以使用多种方法使用此信息。 您可以从MSDN获取更多信息。 请注意,此代码特别引用属性,但是检索字段(GetFields)和所有成员(GetMembers)都有相应的方法。 一旦获得PropertyInfo,就可以调用GetValue方法:
        foreach (System.Reflection.PropertyInfo oProperty in this.GetType().GetProperties()) {
            Console.WriteLine(oProperty.Name + " = " + oProperty.GetValue(this, null).ToString());
        }

如果您同时关注字段和属性:

        foreach (System.Reflection.MemberInfo oMember in this.GetType().GetMembers())
        {
            switch (oMember.MemberType)
            {
                case System.Reflection.MemberTypes.Field:
                    var oField = (System.Reflection.FieldInfo)oMember;
                    Console.WriteLine(oField.Name + " = " + oField.GetValue(this).ToString());
                    break;

                case System.Reflection.MemberTypes.Property:
                    var oProperty = (System.Reflection.PropertyInfo)oMember;
                    Console.WriteLine(oProperty.Name + " = " + oProperty.GetValue(this, null).ToString());
                    break;

            }
        }

我需要进一步解释如何使用它。这基本上与我的代码行相同:var tempList = this.GetType().GetMembers(); - 我不知道在获取信息后如何提取字段。 - Anthony Nichols
1
抱歉,我已更新答案以展示在两种情况下获取名称和值。 - competent_tech

0
你可以在字典中存储数据。对于每个属性,只需从字典中设置/获取值。 就像这样:
public class MyData {
    private Dictionary<string, object> myData;
    public MyData {
        this.myData = new Dictionary<string, object>();
    }

    public decimal LastVersion { get { return (decimal)this.myData["LastVersion"]; } private set { this.myData["LastVersion"] = value; } }

    public PrimaryAbility STR { get { return (PrimaryAbility)this.myData["STR"]; } private set { this.myData["STR"] = value; } }
    public PrimaryAbility DEX { get { return (PrimaryAbility)this.myData["DEX"]; } private set { this.myData["DEX"] = value; } }
    public PrimaryAbility CON { get { return (PrimaryAbility)this.myData["CON"]; } private set { this.myData["CON"] = value; } }
    public PrimaryAbility INT { get { return (PrimaryAbility)this.myData["INT"]; } private set { this.myData["INT"] = value; } }
    public PrimaryAbility WIS { get { return (PrimaryAbility)this.myData["WIS"]; } private set { this.myData["WIS"] = value; } }
    public PrimaryAbility CHA { get { return (PrimaryAbility)this.myData["CHA"]; } private set { this.myData["CHA"] = value; } }

    public DerivedAbility HP { get { return (DerivedAbility)this.myData["HP"]; } private set { this.myData["HP"] = value; } }
    public DerivedAbility MP { get { return (DerivedAbility)this.myData["MP"]; } private set { this.myData["MP"] = value; } }
    public DerivedAbility SP { get { return (DerivedAbility)this.myData["SP"]; } private set { this.myData["SP"] = value; } }
    public DerivedAbility AC { get { return (DerivedAbility)this.myData["AC"]; } private set { this.myData["AC"] = value; } }
}

有一天我发现了这个:"Enum.GetValues(typeof(TvStations))",也许你应该搜索类似的东西。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接