返回类中的所有字段
本文关键字:字段 返回 | 更新日期: 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))",也许你应该搜索一些这样的