访问动态类的动态属性并在C#中设置值

时间:2014-08-12 12:27:26

标签: c# dynamic reflection

我尝试创建一个扩展方法,接受参数为IEnumerable类型,并尝试根据列数和行数生成一些html字符串,如下所示

public static  string Grid<T>(IEnumerable<T> collection )
{
    string template = "<div class='loadTemplateContainer' style='display: block;'>"+
                      "<div class='headercontainer'>";
    PropertyInfo[] classProperties = typeof (T).GetProperties();
    foreach (PropertyInfo classProperty in classProperties)
    {
        template = template + "<div class='column style='width: 200px;'>" + 
        classProperty.Name + "</div>";
    }
    template = template + "</div><table class='allTemplateTable'><tbody>";
    string rowTemplate = "";
    foreach (dynamic item in collection)
    {
        rowTemplate = rowTemplate + "<tr>";
        foreach (PropertyInfo classProperty in classProperties)
        {
            var currentProperty = classProperty.Name;      
        }
    }       
}

我希望通过属性名称从集合中获取项目的每个属性的值。我怎么能实现它?

2 个答案:

答案 0 :(得分:3)

可以通过以下方式完成:

public static string Grid<T>(IEnumerable<T> collection)
{
    ...........
    ...........

    foreach (T item in collection)
    {
        foreach (var p in classProperties )
        {
            string s = p.Name + ": " + p.GetValue(item, null);
        }
    }
}

答案 1 :(得分:2)

由于您使用的是动态而且所有内容都是在运行时设置的 - 您可以考虑使用反射。我看到你已经使用过PropertyInfo所以也许你可以像这样扩展它:

public static object GetPropValue(object src, string propName)
{
    return src.GetType().GetProperty(propName).GetValue(src, null);
}

并在迭代器中使用以获得所需的值。