C# 泛型方法不知道该类型具有特定的方法

C# 泛型方法不知道该类型具有特定的方法,c#,generics,C#,Generics,这不会编译: public ICollection<T> GetRelated<T>(Widget widget, IEnumerable<T> dbSet) where T : class { return dbSet.Where(x => x.WidgetId == widget.WidgetId).ToList(); } 为此: where T : IMyBase 有没有其他方法可以做到这一点?或者这是“这就是接口的用途,所以停止抱怨,

这不会编译:

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

where T : IMyBase

有没有其他方法可以做到这一点?或者这是“这就是接口的用途,所以停止抱怨,开始编码”?

尝试以下方法:

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();
}
公共接口IWidgetId
{
int-WidgetId{get;}
}
公共类小部件
{ 
}
公共ICollection GetRelated(Widget Widget,IEnumerable dbSet),其中T:IWidgetId
{
返回dbSet.Where(x=>x.WidgetId==widget.WidgetId.ToList();
}
使用

它将过滤掉非小部件,但将剩余的小部件元素作为小部件类型的元素呈现

返回类型(小部件)的数据库集,其中(x=>…


<> P>但是,最好让你的<代码> GATEATION/OSKE>方法只在 IcLeCopyt中:Twitter ,并使用它的代码> OfType < /Cuff>过滤器(即在流水线中较早)。你可以尝试C++,它有鸭式输入而不是泛型的强类型。但是C语言的泛型强类型。(也是Java):是的:您需要为可枚举(集合)的元素指定一个更强的类型,而不仅仅是
class
object
将满足
where T:class
约束,但它没有
WidgetId
属性。“这就是接口的用途,所以停止抱怨,开始编码”您可以
返回dbSet.Where(x=>(int)((动态)x.WidgetId)=widget.WidgetId.ToList();
我猜(您可能需要将
(int)
更改为您的ID所具有的类型),但它很难看,会影响性能,而且还缺乏类型安全性(如果意外地编写了错误的方法调用,则可能会在运行时出现异常,而不是编译时错误),因此最好按照您的建议使用一个公共基类或接口。您可以使用System.Linq.Dynamic-您不必删除引用类型约束
where T:class
,因为您包括接口;也就是说,如果您愿意,您可以使用
where T:class,IWidgetId
。我之所以提到这一点,是因为原始问题n had
where T:class
。您的帖子似乎只是重复了问题中已经存在的建议。但它似乎没有回答提出的问题。您的回答基于序列中的元素,这些元素已经是小部件的子类型。问题表明这些元素没有公共基础,只有公共属性。
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();
}