所以我有一个Objects
列表,例如:
var animals = new List<Animal>() //add Animals`
我知道我可以将strings
从This 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)
这可能吗?
答案 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();
}
这是最快的基于反射的方法,因为反射只进行一次而不是像其他答案那样对每个项目进行。