如何推广返回字典或列表的函数

时间:2013-10-25 13:06:42

标签: c# .net generics

我没有试图概括一个应该填充List<>的函数。或字典<>。首先,以下内容无法编译:

T foo<T>() where T : ICollection, new()
{
  T t = new T();

  t.Add(1, 1);

  return t;
}

错误1'T'不包含'Add'的定义,也没有扩展方法'Add'接受类型'T'的第一个参数(你是否缺少using指令或汇编引用?)< / p>

其次,假如这会编译“添加”如何被推广?

t.Add(1, 1) // for dictionaries
and t.Add(1) // for Lists

如果有可能的话会很棒

3 个答案:

答案 0 :(得分:0)

我想出了这个,而不是最优雅的解决方案,不确定我是否会将其投入生产。 它从查询中读取SQL服务器表,该表使用Func&lt;&gt;传入。并且作为参数传入的Action对象用于将对象添加到集合中。

public C Read<C, T>(Func<SqlConnection, SqlDataReader> func, Action<C, T> a)
    where C : ICollection, new()
    where T : EntityBase, new()
{
    C objects = new C();

    using (SqlConnection connection = GetConnection())
    {
        using (SqlDataReader reader = func(connection))
        {
            while (reader.Read())
            {
                T obj = new T();
                obj.PopulateFromReader(reader);
                a(objects, obj);
            }
        }
    }

    return objects;
}

这样叫:

       Dictionary<Guid, DeliveryMoment> dic = _dalBO.Read<Dictionary<Guid, DeliveryMoment>, DeliveryMoment>(connection => { return CmdFactory.ReadDeliveryMoments(connection); }, (d, o) => { d.Add(o.DeliveryMomentId, o); });
你怎么看?太阴暗或可接受?

答案 1 :(得分:0)

static T Temp<T>(params object[] obj) where T:ICollection, new ()
    {
        T s = new T();
        //TODO: validation for input values
        if (s is IDictionary)
        {
            ((IDictionary) s).Add(obj[0], obj[1]);
        }
        else if (s is IList)
        {
            ((IList)s).Add(obj[0]);
        }

        return s;
    }

答案 2 :(得分:0)

也许是一种扩展方法,如下所示

    public static void AddToCollection(this ICollection col, object value)
    {
        if (col is IDictionary)
        {
            ((IDictionary)col).Add(value, value);
        }
        else if(col is IList)
        {
            ((IList)col).Add(value);
        }
    }

然后替换

t.Add(1, 1);

t.AddToCollection(1);