繁体   English   中英

关于IQueryable的思考 <T> 找不到物业

[英]Reflection on IQueryable<T> can't find property

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

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

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赋值,因为property是null,而不是因为它不存在(它确实),因为它没有获取任何属性。 我尝试使用GetProperties()并且没有返回任何内容。

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

_ManagementHelper没有财产。 它只包含三个字段(据您所知)。 所以GetPrperty什么都不返回。 _ManagementHelper的成员更改为属性:

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

我看到一个错误 -

    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定义在哪里?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM