[英]C# generic typing with a user defined class
我想制作盡可能干的代碼。 我正在使用的體系結構具有各種數據:通道,用戶,進程等。每個都有一個公共的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
, 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; }
}
}
但是,這似乎使編譯器感到困惑,因為當我嘗試在新的抽象DataSource類中使用上述Register
,出現編譯器錯誤:
'IData'不包含'Id'的定義,找不到可以接受類型為'IData'的第一個參數的擴展方法'Id'(您是否缺少using指令或程序集引用?)
總有一種方法可以做到這一點。 我究竟做錯了什么?
您剛剛將<T>與<IData>交換了嗎? 那將不起作用,因為您僅更改了泛型類型的名稱。
而是嘗試告訴編譯器通用<T>應該實現IData接口:
public abstract class DataSource<T> : IDataSource<T> where T : IData
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.