带有用户定义类的C#泛型类型

本文关键字:泛型类型 定义 用户 | 更新日期: 2023-09-27 18:27:51

我想制作尽可能DRY的代码。我使用的体系结构有各种数据:Channel、User、Process等。每个数据都有一个公共的Id字符串属性。我目前正在抽象出许多业务逻辑:

using System;
using System.Collections.Generic;
using Vert.Slack;
namespace Vert.Interfaces
{
    public abstract class DataSource<T> : IDataSource<T>
    {
        protected Dictionary<string, T> _items;
        public DataSource()
        {
            _items = new Dictionary<string, T>();
        }
        public abstract bool Register(T item);
        public T LookupUsing<String>(string key)
        {
            T item = default(T);
            item = _items[key];
            return item;
        }
        public IEnumerable<T> List(int? limit)
        {
            List<T> items;
            if(!limit.HasValue)
            {
                items = new List<T>(_items.Values);
            }
            else
            {
                items = new List<T>(limit.Value);
                items.AddRange(_items.Values);
            }
            return items;
        }
        public abstract T LookupUsing<RtmEvent>(Slack.RtmEvent rtmEvent);
        public abstract T LookupUsing<Message>(Slack.Message message);
    }
}

我想使Register通用,因为我目前正在扩展DataSource的每个类上使用此代码(其中唯一的区别是ImUserChannel等):

public override bool Register(Im im)
{
    if(!_items.ContainsKey(im.Id))
    {
        _items.Add(im.Id, im);
    }
    return true;
}

我目前遇到了问题,因为我的第一次尝试是将T更改为我定义为IData:的新类型

namespace Vert.Data
{
    interface IData
    {
        string Id { get; set; }
    }
}

然而,这似乎混淆了编译器,因为当我试图在新的抽象DataSource类中使用上面的Register时,我会得到编译器错误:

"IData"不包含"Id"的定义,也找不到接受第一个类型为IData的参数的扩展方法"Id"(是否缺少using指令或程序集引用?)

必须有一种通用的方法来做到这一点。我做错了什么?

带有用户定义类的C#泛型类型

您刚刚交换了<T>其中<IData>?这不会起作用,因为您只更改了泛型类型的名称。

相反,尝试告诉编译器泛型<T>应该实现IData接口:

public abstract class DataSource<T> : IDataSource<T> where T : IData