根据运行时输入的属性将List <objects>转换为List <string>

时间:2015-09-04 14:29:31

标签: c# list reflection

所以我有一个Objects列表,例如:

var animals = new List<Animal>() //add Animals`

我知道我可以将stringsThis Question转换为List<Animal> animals = new List<Animal>(); List<string> strings = animals.Select(a => (string)a).ToList(); ,如:

List<string>

但是我希望根据我在运行时作为animals提供的属性从string列表中获取private List<string> GetList(string property) { return animals.Select(x => filterByReflection(property)).ToList(); }

例如:

var names = GetList("Name");
var types = GetList("Type");
var ages = GetList("Age");

所以我可以致电:

sell_choices = [(data.id+1, data.sell_name) for data in Sell.objects.all()]
sell_id = models.IntegerField(choices=sell_choices,default=1)

这可能吗?

5 个答案:

答案 0 :(得分:2)

是的,就像这样:

private List<string> GetList(string property)
{
    return animals.Select(x => GetProperty(x, property)).ToList();
}

private static string GetProperty(Animal animal, string property)
{
    Type type = typeof(Animal);
    PropertyInfo propertyInfo = type.GetProperty(property);
    return (string)propertyInfo.GetValue(animal);
}

答案 1 :(得分:2)

完整的工作示例:

function zoom() {

    svg.select(".x.axis").call(xAxis);
    svg.select(".y.axis").call(yAxis);

    svg.selectAll(".dot")
    .attr("cx", function (d) {
    return xScale(d.lng);
    })
    .attr("cy", function (d) {
    return yScale(d.alt);
});

}

答案 2 :(得分:0)

所以我发现我可以使用这些方法通过PropertyInfo

获取Reflection
private string GetValue(object item, string propString)
    {
        if (item != null)
        {
            if (!string.IsNullOrEmpty(propString))
            {
                try
                {
                    var property = GetProperty(item.GetType().GetTypeInfo(), AutoCompleteSourceMember);
                    if (property != null)
                    {
                        var value = property.GetValue(item);
                        if (value != null)
                        {
                            return value.ToString();
                        }

                    }
                    return string.Empty;

                }
                catch (Exception ex)
                {
                    return string.Empty;
                }
            }
            else
            {
                return item.ToString();
            }
        }
        return string.Empty;
    }

    private static PropertyInfo GetProperty(TypeInfo typeInfo, string propertyName)
    {
        var propertyInfo = typeInfo.GetDeclaredProperty(propertyName);
        if (propertyInfo == null && typeInfo.BaseType != null)
        {
            propertyInfo = GetProperty(typeInfo.BaseType.GetTypeInfo(), propertyName);
        }
        return propertyInfo;
    }

并使用它:

private List<string> GetList(string property)
{
    return animals.Select(x => GetValue(x,property)).ToList();
}

答案 3 :(得分:0)

由于您知道它们是nMyVal = *((TypeOf(nMyVal)*)pvBuffer); ,因此您可以直接将strings的结果投射到filterByReflection

string

更一般地说,您可以将此方法设为通用:

private List<string> GetList(string property)
{
    return animals.Select(x => (string)filterByReflection(property)).ToList();
}

当然,如果您传入的属性名称在第一种情况下不会返回private List<T> GetList<T>(string property) { return animals.Select(x => (T)filterByReflection(property)).ToList(); } ,或者在第二种情况下传入string,则会在运行时获得T。< / p>

答案 4 :(得分:0)

通用功能:

public static class Extensions
{
    public static IEnumerable<P> SelectProperty<T, P>(this IEnumerable<T> source, string propertyName)
    {
        var selector = (Func<T, P>)Delegate.CreateDelegate(typeof(Func<T, P>), typeof(T).GetProperty(propertyName).GetGetMethod());
        return source.Select(selector);
    }
}

和用法:

private List<string> GetList(string property)
{
    return animals.SelectProperty<Animal, string>(property).ToList();
}

这是最快的基于反射的方法,因为反射只进行一次而不是像其他答案那样对每个项目进行。