我希望编写尽可能干燥的代码。我使用的架构具有各种数据: 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?)
必须有一种通用的方法来做到这一点。我做错了什么?
最佳答案
您刚刚与
尝试告诉编译器通用
public abstract class DataSource<T> : IDataSource<T> where T : IData
关于使用用户定义的类的 C# 泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34426417/