我有一个Match对象,构造为,
class Match
{
public string location { get; set; }
public List<Team> teams { get; set; }
public Match()
{
location = "Wembley";
teams = new List<Team>();
teams.Add(new Team("Arsenal"));
teams.Add(new Team("Burnley"));
}
}
public class Team
{
public string name { get; set; }
public int score { get; set; }
public Team(string title)
{
name = title;
score = 0;
}
}
我使用助手类来获取值,
public static class Helper
{
public static object GetPropertyValue(this object T, string PropName)
{
return T.GetType().GetProperty(PropName) == null ? null : T.GetType().GetProperty(PropName).GetValue(T, null);
}
}
我打算允许用户通过在GUI中键入例如“ match.team [1] .name”来设置值,然后将其拆分为参数调用,例如此代码;这可能会下降几层。在这里,我们向下一层从列表的成员中获取属性值,
int teamNo = 1;
MessageBox.Show(GetSubProperty(match, "teams", teamNo, "name"));
我的常规是这样,
private string GetSubProperty(object obj, string prop1, int whichItem, string prop2)
{
var o = obj.GetPropertyValue(prop1);
object subObject = ((List<Team>)o)[whichItem];
return subObject.GetPropertyValue(prop2).ToString();
}
在“团队列表”对象之一中获取属性时,必须在访问列表中的单个项目之前将值强制转换为“列表”。我想知道如何对发送的任何对象类型进行通用处理。我尝试了List和ArrayList以及其他多种变体,但遇到错误“无法转换类型为'System.Collections.Generic.List { {1}} 1 [System.Object]”
答案 0 :(得分:1)
使用IEnumerable。这似乎可行:
private string GetSubProperty(object obj, string prop1, int whichItem, string prop2)
{
var o = obj.GetPropertyValue(prop1);
int count = 0;
foreach (object subObject in (IEnumerable)o)
{
if (whichItem == count++)
{
return subObject.GetPropertyValue(prop2).ToString();
}
}
return null;
}
当然,请务必检查此强制转换是否起作用。通过尝试转换为各种事物并基于o的类型执行适当的代码,可以使您的解决方案更加通用。