C#具有用户定义类的泛型键入

C#具有用户定义类的泛型键入,c#,generics,C#,Generics,我想让代码尽可能的枯燥。我使用的体系结构有各种数据:通道、用户、进程等。每个数据都有一个公共Idstring属性。我目前正在通过以下方式抽象出许多业务逻辑: using System; using System.Collections.Generic; using Vert.Slack; namespace Vert.Interfaces { public abstract class DataSource<T> : IDataSource<T> {

我想让代码尽可能的枯燥。我使用的体系结构有各种数据:通道、用户、进程等。每个数据都有一个公共
Id
string属性。我目前正在通过以下方式抽象出许多业务逻辑:

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);
    }
}
我目前遇到了问题,因为我的第一次尝试是将
T
更改为我定义为
IData
的新类型:

namespace Vert.Data
{
    interface IData
    {
        string Id { get; set; }
    }
}
然而,这似乎使编译器感到困惑,因为当我尝试在新的抽象数据源类中使用上述
寄存器时,我得到了编译器错误:

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

总有办法做到这一点。我做错了什么?

你刚刚和我交换了?这将不起作用,因为您只是更改了泛型类型的名称而已

请尝试告诉编译器generic应实现IData接口:

public abstract class DataSource<T> : IDataSource<T> where T : IData
公共抽象类数据源:IDataSource其中T:IData

看起来你应该可以做你正在尝试的事情,但正如帖子所说的,很难准确地看到发生了什么。您能否创建一个生成指定编译器错误的接口?请尝试将您的接口公开?或者它选择了错误的接口,也被命名为
IData
。这正是我所缺少的。非常感谢。
public abstract class DataSource<T> : IDataSource<T> where T : IData