作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在仅限于特定类型的泛型类上定义一个方法。我想出了这个:
interface IHasId
{
int Id { get; }
}
public class Foo<T>
{
private List<T> children;
public IHasId GetById(int id)
{
foreach (var child in children.Cast<IHasId>())
{
if (child.Id == id)
{
return child;
}
}
return null;
}
}
它会工作,但它看起来像代码味道......似乎应该有一种方法让编译器强制执行此操作。像这样的东西:
public class Foo<T>
{
public IHasId GetById<TWithId>(int id) where TWithId : IHasId {}
}
或者,甚至更好:
public class Foo<T>
{
public IHasId GetById(int id) where T : IHasId {}
}
我看到一些与 Java 相关的帖子,其中一篇专门讨论将 T 限制为枚举,但没有直接切入点。
最佳答案
你不能有基于单一类型的可选方法。但是,您可以使用继承来使其发挥作用。
方法如下:
public interface IHasId
{
int Id { get; }
}
public class Foo<T>
{
protected List<T> children;
}
public class FooHasId<T> : Foo<T> where T : IHasId
{
public IHasId GetById(int id)
{
foreach (var child in children)
{
if (child.Id == id)
{
return child;
}
}
return null;
}
}
使用 C#6 FooHasId
可以缩短为:
public class FooHasId<T> : Foo<T> where T : IHasId
{
public IHasId GetById(int id) => this.children.FirstOrDefault(x => x.Id == id);
}
关于泛型类中的 c# 方法仅适用于某些类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44233004/
我是一名优秀的程序员,十分优秀!