我试图从一个实体中获取一个属性,并对这些值求和。我使用的是泛型,实体的类型和属性的名称在运行时是已知的。以下(简化的)代码编译得很好,但抛出了"Object与目标类型不匹配“。当尝试从实体获取属性时。代码如下:
public class SomeModel
{
public int ValueA { get; set; }
public int ValueB { get; set; }
}
public class SomeViewModel
{
public int ViewValue { get; set; }
}
public class HomeController : Controller
{
public ActionResult Index()
{
IEnumerable<SomeModel> data = GetData();
var result = SumValues(data, a => new SomeViewModel { ViewValue = a.ValueA });
return Content(string.Format("Total is: {0}", result));
}
private int SumValues<T, TRes>(IEnumerable<T> data, Func<T, TRes> transformation)
{
var transformedData = data.Select(transformation);
Type type = typeof(TRes);
PropertyInfo property = type.GetProperty("ViewValue");
IEnumerable<int> listOfValues = property.GetValue(transformedData, null) as IEnumerable<int>;
var sum = listOfValues.Sum();
return sum;
}
private IEnumerable<SomeModel> GetData()
{
var data = new List<SomeModel>();
Random random;
for (int i = 0; i < 1000; i++)
{
random = new Random(i);
data.Add(new SomeModel { ValueA = random.Next(5,100), ValueB = random.Next(20,80) });
}
return data;
}
}我在这里生成了假数据,但真正的应用程序是使用EF从数据库中带来数据。泛型对我来说是新的,所以请给我任何指导我正确方向的建议,我将非常感激。
发布于 2013-03-14 22:26:04
在这一行中:
IEnumerable<int> listOfValues =
property.GetValue(transformedData, null) as IEnumerable<int>;您正在尝试检索List<SomeModel>对象的ViewValue属性的值,但List<SomeModel>没有ViewValue属性。你可以做的一件事是:
IEnumerable<int> listOfValues =
transformedData.Select(i => (int)property.GetValue(i, null));但一个更干净的解决方案是完全避免反射,因为这里不需要反射:
interface IViewValue
{
int ViewValue { get; set; }
}
public class SomeViewModel : IViewValue
{
public int ViewValue { get; set; }
}
private int SumValues<T, TRes>(IEnumerable<T> data, Func<T, TRes> transformation)
where TRes : IViewValue
{
var transformedData = data.Select(transformation);
IEnumerable<int> listOfValues = transformedData.Select(i => i.ViewValue);
var sum = listOfValues.Sum();
return sum;
}https://stackoverflow.com/questions/15411804
复制相似问题