Cast To Interface

2020-04-21 09:13发布

问题:

I am not getting any errors in my code, but my filter object is always null. When I run the debugger the filter object looks just like the sort object, a list with stuff in it. Although as you can see it is actually a interface.. What do I need to change in this code to access the information in the filter? I guess my main problem is I don't quite fully grasp how to work with interfaces.

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;
}

回答1:

The list is null because you are trying to cast List<IFilterDescriptor> into List<FilterDescriptor>, but just because FilterDescriptor inherits from IFilterDescriptor doesn't mean that List<FilterDescriptor> inherits from List<IFilterDescriptor> (unless the list is covariant List<in T> which it isn't).

You should do it like this:

IList<IFilterDescriptor> filter = request.Filters;

if the interface is fine with that, otherwise you can case the list like that:

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


回答2:

Thanks for the help guys I talked to a friend of mine and he suggested I do this... So I guess I should not have been trying to cast the Lists and Interfaces.

    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;
    }