【问题标题】:Reflection on IQueryable<T> can't find property反思 IQueryable<T> 找不到属性
【发布时间】:2013-03-01 04:10:09
【问题描述】:

我创建了一个自定义的 gridview 控件并将其导出到一个 dll 中,以便我可以重复使用它。在 dll 中,我创建了一个函数来获取数据源,我试图从那里填充一个下拉列表,但失败了。

所以在我的网站上我有这个

public partial class _Management : System.Web.UI.Page
{
    public class _ManagementHelper
    {
        public int ID;
        public string CompanyName;
        public string ResourceName;
    }

    protected void Page_Load(object sender, EventArgs e)
    {    
        ucGridViewEx.DataSource = ucGridViewEx_Source();
        ucGridViewEx.DataBind();
    }

    private List<dynamic> ucGridViewEx_Source()
    {
        var source = dl.ComapniesResources.Select(x => new _ManagementHelper
        {
            ID = x.ResourceID,
            CompanyName = x.Supplier1.SupplierName,
            ResourceName = x.Name
        });

        return ucGridViewEx.GridViewExDataSource(source);
}

那么dll里面的自定义控件就有这个相关代码

public List<dynamic> GridViewExDataSource<T>(IQueryable<T> query)
{
    foreach (var column in this.Columns)
    {
        var gridViewExColumn = column as ColumnEx;
        if (gridViewExColumn != null
            && gridViewExColumn.SearchType == SearchTypeEnum.DropDownList)
        {
            gridViewExColumn.DropDownDataSource = query.GetDropDownDataSource(gridViewExColumn.DataField);
        }
    }

    return ((IQueryable<dynamic>)query).ToList<dynamic>();
}

函数 GetDropDownDataSource() 位于与 gridview 相同的 dll 内的另一个扩展类中

internal static List<ListItem> GetDropDownDataSource<T>(this IQueryable<T> query,
    string dataField)
{
    var ddlSource = new List<ListItem>();

    // x =>
    var xParameter = Expression.Parameter(typeof(T), "x");

    // x.Property
    var propery = typeof(T).GetProperty(dataField);

    // x => x.Property
    var columnLambda = Expression.Lambda(Expression.Property(xParameter, propery), xParameter);

    return ddlSource;
}

代码在我将值分配给 columnLambda 时失败,因为属性为空,而不是因为它不存在(它确实存在),因为没有获取任何属性。我尝试使用 GetProperties() 并没有返回任何内容。

自从我移至 DataSource 以选择 _ManagementHelper 后,我对发生这种情况感到好奇。我之前在 ucGridViewEx_Source() 上使用了动态( Select(x => new {}) ),并且效果很好。请不要提供继续使用动态的解决方案,因为我需要允许使用动态和使用自定义对象这两种类型。

【问题讨论】:

    标签: c# asp.net reflection dll webforms


    【解决方案1】:

    _ManagementHelper 没有属性。它仅包含三个字段(据您告诉我们)。所以GetPrperty 什么也不返回。将_ManagementHelper的成员改为属性:

    public class _ManagementHelper
    {
        public int ID { get; set; }
        public string CompanyName { get; set; }
        public string ResourceName { get; set; }
    }
    

    【讨论】:

    • 感谢@md-Unicorn 这适用于这种情况。但是我有另一个请求要做,如果我有一个复杂的查询并执行 ToList().AsQuerable() 它也不起作用,同样的问题没有找到属性。你对这个案子有什么建议吗?如果令人困惑,我可以修改第一个问题添加此问题
    • @vcliment89 在看到代码之前我什么都猜不到。您可以编辑您的问题并添加您的其他方案,或者您可以提出其他问题(首选)。
    【解决方案2】:

    我发现了一个错误 --

        var source = dl.ComapniesResources.Select(x => new _ManagementHelper
        {
            // ResourceID = x.ResourceID, this was the old code
            ID = x.ResourceID,  // fixed code
            CompanyName = x.Supplier1.SupplierName,
            ResourceName = x.Name
        });
    

    还有,ListItem 是在哪里定义的?

    【讨论】:

    • 对不起@Hogan,我确实修改了代码,删除了这个问题的不必要代码并忘记了更改它。我会改正的
    猜你喜欢
    • 2018-12-26
    • 2018-05-15
    • 1970-01-01
    • 1970-01-01
    • 2015-08-27
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    相关资源
    最近更新 更多