使用用户定义的类的 C# 泛型类型

标签 c# generics

我希望编写尽可能干燥的代码。我使用的架构具有各种数据: channel 、用户、进程等。每个数据都有一个公共(public) 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 的每个类上使用此代码(唯一的区别是 Im用户 channel 等):

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' does not contain a definition for 'Id' and no extension method 'Id' accepting a first argument of type 'IData' could be found (are you missing a using directive or assembly reference?)

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

最佳答案

您刚刚与 交换了 吗?这不起作用,因为您只是更改了泛型类型的名称而已。

尝试告诉编译器通用 应该实现 IData 接口(interface):

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

关于使用用户定义的类的 C# 泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34426417/

相关文章:

c# - 你如何在 C# 中引用 MS Office 互操作?

c# - 使用 Parallel 创建绑定(bind)项时 CollectionViewSource.SortDescriptions 不起作用

c# - 有没有办法使用 .net 驱动程序忽略 cassandra 数据库中实体的列

java - 为什么 Collection 参数的通用版本正在调用

java - 使用泛型类作为类型参数

java - 使用泛型进行二进制搜索并捕获

c# - .NET Core 中的 MethodInfo ReflectedType

c# - 更新一个对象中的值更新第二个对象值 ASP.Net identity 2.0

generics - 再次出现 F# 中(非)通用模块的问题

c# - 泛型和接口(interface)问题