首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >尝试从IEnumerable<TRes>获取属性时,对象与目标类型不匹配,该属性的结果为Func<T,TRes> .Net 4

尝试从IEnumerable<TRes>获取属性时,对象与目标类型不匹配,该属性的结果为Func<T,TRes> .Net 4
EN

Stack Overflow用户
提问于 2013-03-14 22:18:05
回答 1查看 2.2K关注 0票数 0

我试图从一个实体中获取一个属性,并对这些值求和。我使用的是泛型,实体的类型和属性的名称在运行时是已知的。以下(简化的)代码编译得很好,但抛出了"Object与目标类型不匹配“。当尝试从实体获取属性时。代码如下:

代码语言:javascript
运行
复制
    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从数据库中带来数据。泛型对我来说是新的,所以请给我任何指导我正确方向的建议,我将非常感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-14 22:26:04

在这一行中:

代码语言:javascript
运行
复制
IEnumerable<int> listOfValues = 
                       property.GetValue(transformedData, null) as IEnumerable<int>;

您正在尝试检索List<SomeModel>对象的ViewValue属性的值,但List<SomeModel>没有ViewValue属性。你可以做的一件事是:

代码语言:javascript
运行
复制
IEnumerable<int> listOfValues = 
                       transformedData.Select(i => (int)property.GetValue(i, null));

但一个更干净的解决方案是完全避免反射,因为这里不需要反射:

代码语言:javascript
运行
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15411804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档