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>方法只在
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 hadwhere 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();
}