[英]Creating a generic method in C# through specific where clause
我想创建一些通用方法,如以下代码:
public async Task<T> Get<T>(string url) where T : IBaseModel, IList<IBaseModel>
显然我想支持可枚举集合以及从IBaseModel
接口驱动的单个对象。 方法定义是可以的,但是当涉及到它的使用时,我会得到以下错误:
await myClass.Get<List<DrivedClassFromBaseModel>>("some url");
There is no implicit conversion from "System.Collection.Generic.List<DrivedClassFromBaseModel> to System.Collection.Generic.IList<IBaseModel>"
通用约束将通过 AND 组合,因此where T : IBaseModel, IList<IBaseModel>
意味着T
应该同时实现IBaseModel
和IList<IBaseModel>
。
您需要创建两个方法:
public async Task<T> Get<T>(string url) where T : IBaseModel
public async Task<IList<T>> GetList<T>(string url) where T : IBaseModel
您可以使用另一个同时实现 IBaseModel 和 IList 的类,然后 T 被约束到这个类。
public class DerivedModel : IBaseModel, IList<IBaseModel>
{
private int _size;
private IBaseModel[] _items=new IBaseModel[1000];
private int _version;
public int Id { get; set; }
public IEnumerator<IBaseModel> GetEnumerator()
{
throw new NotImplementedException();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
...
}
通用方法是:
public async Task<T> Get<T>(string url) where T : DerivedModel
{
return await Task<T>.Factory.StartNew(() =>
{
var derivedModel = new DerivedModel() {new BaseModel() {Id = 1}};
return (T) derivedModel;
});
}
其中 IBaseModel 和 BaseModel 可以是:
public interface IBaseModel
{
int Id { get; set; }
}
public class BaseModel : IBaseModel
{
public int Id { get; set; }
}
用法:
var inheritance=new Inheritance();
var result = await inheritance.Get<DerivedModel>("aaa");
textBox1.Text = result[0].Id.ToString();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.