返回类中的所有字段

本文关键字:字段 返回 | 更新日期: 2023-09-27 17:54:16

我试图循环遍历类中的字段,将特定类型的字段放入列表中,然后返回该列表。我知道我错过了一些关键组件,但我不知道我做错了什么。这是我目前所看到的:

...

我需要返回一个实际字段的列表作为指针,而不是数据的副本。如果你能帮上忙,我将不胜感激。

我删除了上面的代码(您应该仍然能够在历史记录中看到它),因为它令人困惑。这是更新后的代码(删除了一些额外的东西),由于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。

返回类中的所有字段

您可以通过反射来实现这一点。

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;
            }
        }

您可以将数据存储在Dictionary中。对于每个属性只从字典中设置/获取值。像这样:

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))",也许你应该搜索一些这样的