转换为接口

时间:2014-03-04 20:19:39

标签: c# .net interface casting

我的代码中没有出现任何错误,但我的过滤器对象始终为null。当我运行调试器时,过滤器对象看起来就像排序对象,包含其中的东西的列表。虽然您可以看到它实际上是一个界面..我需要在此代码中更改哪些内容才能访问过滤器中的信息?我想我的主要问题是我不完全掌握如何使用接口。

public IList<Kendo.Mvc.IFilterDescriptor> Filters { get; set; }
public IList<Kendo.Mvc.SortDescriptor> Sorts { get; set; }
 
List<SortDescriptor> sort = request.Sorts as List<SortDescriptor>;
if(sort.Count == 1)
{
    pRequest.SortMember = sort[0].Member;
    pRequest.SortDirection = (int)sort[0].SortDirection;

}

List<FilterDescriptor> filter = request.Filters as List<FilterDescriptor>;
if (filter != null)
{
    pRequest.Startdate = (DateTime)filter[0].ConvertedValue;
}
else
{
    var endDate = new TimeSpan(4000, 0, 0, 0, 0);
    pRequest.Startdate = DateTime.UtcNow - endDate;
}

2 个答案:

答案 0 :(得分:2)

该列表为空,因为您尝试将List<IFilterDescriptor>转换为List<FilterDescriptor>,但仅仅因为FilterDescriptor继承自IFilterDescriptor并不意味着List<FilterDescriptor>继承自List<IFilterDescriptor>(除非列表是协变的List<in T>,否则它不是)。

你应该这样做:

IList<IFilterDescriptor> filter = request.Filters;

如果接口处于罚款状态,否则您可以像下面这样列出:

List<FilterDescriptor> filter = request.Filters.OfType<FilterDescriptor>.ToList();

答案 1 :(得分:2)

感谢帮助我和我的一个朋友交谈的人,他建议我这样做......所以我想我不应该试图投射列表和接口。

            if(request.Sorts.Count == 1)
        {
            pRequest.SortMember = request.Sorts[0].Member;
            pRequest.SortDirection = (int)request.Sorts[0].SortDirection;

        }

        if (request.Filters.Count >= 1)
        {
            foreach(var item in request.Filters)
            {
               if(item is Kendo.Mvc.FilterDescriptor)
               {
                   var descriptor = (Kendo.Mvc.FilterDescriptor)item;
                   pRequest.Startdate = (DateTime)descriptor.ConvertedValue;
               }
            }

        }
        else
        {
            var endDate = new TimeSpan(4000, 0, 0, 0, 0);
            pRequest.Startdate = DateTime.UtcNow - endDate;
        }