在C#中,通常获取List对象内的属性值

时间:2018-10-25 15:15:37

标签: c# list object reflection

我有一个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]”

1 个答案:

答案 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的类型执行适当的代码,可以使您的解决方案更加通用。