簡體   English   中英

用戶定義的類的C#通用類型

[英]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的每個類上都使用此代碼(唯一的區別是ImUserChannel等):

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM