繁体   English   中英

通过特定的 where 子句在 C# 中创建通用方法

[英]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应该同时实现IBaseModelIList<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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM