我想制作尽可能干的代码.我正在使用的架构有各种数据: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);
}
}
Run Code Online (Sandbox Code Playgroud)
我想使Register通用的,因为我目前使用的扩展数据源对我的每一个类的代码(其中,唯一的区别是Im,User,Channel等):
public override bool Register(Im im)
{
if(!_items.ContainsKey(im.Id))
{
_items.Add(im.Id, im);
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
我目前遇到问题,因为我的第一次尝试是更改T为我定义为的新类型IData:
namespace Vert.Data
{
interface IData
{
string Id { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
然而,这似乎混淆了编译器,因为当我尝试Register在新的抽象DataSource类中使用上面的内容时,我得到编译器错误:
'IData'不包含'Id'的定义,并且没有扩展方法'Id'可以找到接受'IData'类型的第一个参数(你是否缺少using指令或汇编引用?)
一般来说,有一种方法可以做到这一点.我究竟做错了什么?
小智 5
你刚刚用<IData>交换了<T>?这不会起作用,因为你刚刚更改了泛型类型的名称.
而是试着告诉编译器泛型<T>应该实现IData接口:
public abstract class DataSource<T> : IDataSource<T> where T : IData
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
188 次 |
| 最近记录: |