将模型(或类)传递给函数并让它返回IOrderedEnumerable

时间:2015-09-17 00:58:47

标签: c# entity-framework model-view-controller

我目前正在设置一个名为IOrderedEnumerable的{​​{1}}变量。我想创建一个函数,我可以将properties传递给它并让它返回OrdersDemo.Models.facility_customer_orders。我试图让它工作但失败了。

有没有人对如何创建这个功能有任何想法?

IOrderedEnumerable

这就是我想要完成的事情: 这将是我的新电话。我有一个名为var properties = typeof(OrdersDemo.Models.facility_customer_orders).GetProperties() .Where(p => p.IsDefined(typeof(AdditionalModelAttributes), false)) .Select(p => new { globalColumnName = p.GetCustomAttributes(typeof(AdditionalModelAttributes), true).Cast<AdditionalModelAttributes>().FirstOrDefault().GlobalColumnName, displayHeaderName = p.GetCustomAttributes(typeof(AdditionalModelAttributes), true).Cast<AdditionalModelAttributes>().FirstOrDefault().DisplayHeaderName, displayOrder = p.GetCustomAttributes(typeof(AdditionalModelAttributes), true).Cast<AdditionalModelAttributes>().FirstOrDefault().DisplayDisplayOrder, displayFKTable = p.GetCustomAttributes(typeof(AdditionalModelAttributes), true).Cast<AdditionalModelAttributes>().FirstOrDefault().DisplayFKTable, displayFKLookupIdColumn = p.GetCustomAttributes(typeof(AdditionalModelAttributes), true).Cast<AdditionalModelAttributes>().FirstOrDefault().DisplayFKLookupIdColumn, displayFKLookupDisplayColumn = p.GetCustomAttributes(typeof(AdditionalModelAttributes), true).Cast<AdditionalModelAttributes>().FirstOrDefault().DisplayFKLookupDisplayColumn }) .OrderBy(o => o.displayOrder); 的类和一个名为AdditionalModelAttributeMethods的方法。

GetAdditionalAttributes

我的方法看起来像这样:

var properties = AdditionalModelAttributeMethods.GetAdditionalAttributes(OrdersDemo.Models.facility_customer_orders);

我无法转换输入和输出类型以接收类并将public IOrderedEnumerable<dynamic> GetAdditionalAttributes(class aModel) { return typeof(aModel).GetProperties() .Where(p => p.IsDefined(typeof(AdditionalModelAttributes), false)) .Select(p => new { globalColumnName = p.GetCustomAttributes(typeof(AdditionalModelAttributes), true).Cast<AdditionalModelAttributes>().FirstOrDefault().GlobalColumnName, displayHeaderName = p.GetCustomAttributes(typeof(AdditionalModelAttributes), true).Cast<AdditionalModelAttributes>().FirstOrDefault().DisplayHeaderName, displayOrder = p.GetCustomAttributes(typeof(AdditionalModelAttributes), true).Cast<AdditionalModelAttributes>().FirstOrDefault().DisplayDisplayOrder, displayFKTable = p.GetCustomAttributes(typeof(AdditionalModelAttributes), true).Cast<AdditionalModelAttributes>().FirstOrDefault().DisplayFKTable, displayFKLookupIdColumn = p.GetCustomAttributes(typeof(AdditionalModelAttributes), true).Cast<AdditionalModelAttributes>().FirstOrDefault().DisplayFKLookupIdColumn, displayFKLookupDisplayColumn = p.GetCustomAttributes(typeof(AdditionalModelAttributes), true).Cast<AdditionalModelAttributes>().FirstOrDefault().DisplayFKLookupDisplayColumn }) .OrderBy(o => o.displayOrder); } 返回到我的变量IEnumerableList

2 个答案:

答案 0 :(得分:1)

您无法返回匿名类型。创建具体类型并将其返回。

答案 1 :(得分:0)

以下是一些选项,按照普遍接受的顺序:

  1. 创建一个具体的类来表示类,并使用IEnumerable<{type}>作为函数的返回类型。
  2. 将返回类型设置为IEnumerable<dynamic>。您至少可以引用调用代码中的属性,尽管调用在运行时才会被绑定,
  3. 使用IEnumerable<object>作为返回类型。调用代码必须使用反射来访问属性。
  4. 由于您只是查询AdditionalModelAttributes的多个属性,因此可以执行

    var properties = typeof(OrdersDemo.Models.facility_customer_orders).GetProperties()
    .Where(p => p.IsDefined(typeof(AdditionalModelAttributes), false))
    .Select(p => p.GetCustomAttributes(typeof(AdditionalModelAttributes), true)
                  .Cast<AdditionalModelAttributes>()
                  .FirstOrDefault())
    .OrderBy(o => o.DisplayDisplayOrder);
    

    并使用IEnumerable<AdditionalModelAttributes>的返回类型,但是您没有提供足够的信息来确定这是否是正确的方法。

    由于您似乎决定不使用具体类型,因此您需要在方法中进行最小更改:

    public IEnumerable<dynamic> GetAdditionalAttributes(object aModel)
    {
        return aModel.GetType().GetProperties()
        .Where(p => p.IsDefined(typeof(AdditionalModelAttributes), false))
        ...