我想制作尽可能干的代码.我正在使用的架构有各种数据:Channel,User,Process等.每个都有一个公共Id
字符串属性.我目前正在通过以下方式抽象出许多业务逻辑:
using System; using System.Collections.Generic; using Vert.Slack; namespace Vert.Interfaces { public abstract class DataSource: IDataSource { protected Dictionary _items; public DataSource() { _items = new Dictionary (); } public abstract bool Register(T item); public T LookupUsing (string key) { T item = default(T); item = _items[key]; return item; } public IEnumerable List(int? limit) { List items; if(!limit.HasValue) { items = new List (_items.Values); } else { items = new List (limit.Value); items.AddRange(_items.Values); } return items; } public abstract T LookupUsing (Slack.RtmEvent rtmEvent); public abstract T LookupUsing (Slack.Message message); } }
我想使Register
通用的,因为我目前使用的扩展数据源对我的每一个类的代码(其中,唯一的区别是Im
,User
,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; } } }
然而,这似乎混淆了编译器,因为当我尝试Register
在新的抽象DataSource类中使用上面的内容时,我得到编译器错误:
'IData'不包含'Id'的定义,并且没有扩展方法'Id'可以找到接受'IData'类型的第一个参数(你是否缺少using指令或汇编引用?)
一般来说,有一种方法可以做到这一点.我究竟做错了什么?
你刚刚用
而是试着告诉编译器泛型
public abstract class DataSource: IDataSource where T : IData