泛型方法不知道类型具有特定方法

时间:2018-12-04 21:12:29

标签: c# generics

无法编译:

public ICollection<T> GetRelated<T>(Widget widget, IEnumerable<T> dbSet) where T : class
{
    return dbSet.Where(x => x.WidgetId == widget.WidgetId).ToList();
}

红色的波浪形在x.WidgetId处,错误是

  

无法解析符号“ WidgetId”。

我将使用的所有类型都是具有WidgetId属性的类,但是编译器并不知道。

我怀疑使它起作用的唯一方法是创建一个基类或包含WidgetId属性的接口(我们将其称为IMyBase),并具有所有适当的类派生或实现这一点,然后进行更改:

where T : class

对此:

where T : IMyBase

还有其他方法可以做到这一点吗?还是这种情况是“那是接口的用途,所以请停止抱怨并开始编码”?

2 个答案:

答案 0 :(得分:1)

尝试这种方法:

public interface IWidgetId
{
    int WidgetId { get; }
}

public class Widget
{ 
}

public ICollection<T> GetRelated<T>(Widget widget, IEnumerable<T> dbSet) where T : IWidgetId
{
    return dbSet.Where(x => x.WidgetId == widget.WidgetId).ToList();
}

答案 1 :(得分:-2)

使用Enumerable.OfType(TResult)

它将过滤掉非小部件,但将其余的小部件元素显示为小部件类型的元素。

return dbSet.OfType(Widget).Where(x => ……

但是最好使GetRelated方法仅在ICollection<T> where T: Widget上起作用,并使用其外部的OfType<Widget>过滤器(例如,在管道中的较早位置)进行设计。