当前位置:  开发笔记 > 编程语言 > 正文

使用用户定义的类进行C#泛型键入

如何解决《使用用户定义的类进行C#泛型键入》经验,为你挑选了1个好方法。

我想制作尽可能干的代码.我正在使用的架构有各种数据: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指令或汇编引用?)

一般来说,有一种方法可以做到这一点.我究竟做错了什么?



1> 小智..:

你刚刚用交换了?这不会起作用,因为你刚刚更改了泛型类型的名称.

而是试着告诉编译器泛型应该实现IData接口:

public abstract class DataSource : IDataSource where T : IData

推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有