我没有试图概括一个应该填充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
如果有可能的话会很棒
答案 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);