泛型的高级应用,求解

火拼阿三 2013-07-09 10:29:21

/// <summary>
/// MongoDB添加数据
/// </summary>
/// <typeparam name="T">类</typeparam>
/// <param name="connstr">连接字符串如127.0.0.1</param>
/// <param name="DatabaseName">数据库名</param>
/// <param name="CollectionName">表名</param>
/// <param name="t">添加的类</param>
/// <returns>如果为空证明正确,不为空则为异常信息</returns>
public static string WriteCollection<T>(String connstr, String DatabaseName, String CollectionName, T t)
{
String Message = string.Empty;
try
{
using (Mongo_db = new MongoDBHelper(connstr, DatabaseName))
{
if (t != null)
{
if (t.GetType().Name.IndexOf("List") >= 0)
{
//这里我自己写的判断传递进来的t是泛型集合的
//问题就在于我如何把这T行转换有数据的List<T>型呢
}
else
{

Mongo_db.Insert<T>(t, CollectionName);
}
}
}
}
catch (Exception ex)
{
Message = ex.Message;
}
return Message;
}

调用方法如: List<M_Personal> modelList = new List<M_Personal>();
Message = WriteDB.WriteCollection<List<M_Personal>;("127.0.0.1", "table1", "table3", modelList);
请高手们解答下,告诉我如何判断和转换,谢谢大神们,貌似要用到反射,我试了一些没有弄成我想要的。。

...全文
235 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
火拼阿三 2013-07-10
  • 打赏
  • 举报
回复
引用 21 楼 sqlchen 的回复:
[quote=引用 9 楼 fate1987 的回复:] [quote=引用 7 楼 sqlchen 的回复:]

		public static string WriteCollection<T>(String connstr, String databaseName, String collectionName, IList<T> t)
		{
			String Message = string.Empty;
			try
			{
				using (Mongo_db = new MongoDBHelper(connstr, DatabaseName))
				{
					if (t != null)
					{
						Mongo_db.Insert<T>(t, CollectionName);
					}
				}
			}
			catch (Exception ex)
			{
				Message = ex.Message;
			}
			return Message;
		}

// 调用
List<M_Personal> modelList = new List<M_Personal>();
Message = WriteDB.WriteCollection<M_Personal>;("127.0.0.1", "table1", "table3", modelList);
这样写不知道行不行?
这样写了的话,后台重载的方法不会区分是List<T>还是T,他都当T传了。。。[/quote] 怎么会不行?(你的 Mongo_db.Insert<T> 方法可能也需要改一下) 下面的测试正确通过:

public static string WriteCollection<T>(String connstr, String databaseName, String collectionName, IList<T> t)
{
	String message = string.Empty;
	try
	{
		var list = new List<T>();
		list.Insert(0, t[0]);
		Console.WriteLine(list.Count); // 输出1

		list.Clear();
		list.AddRange(t);
		Console.WriteLine(list.Count); // 输出3

		//using (Mongo_db = new MongoDBHelper(connstr, DatabaseName))
		//{
		//	if (t != null)
		//	{
		//		Mongo_db.Insert<T>(t, CollectionName);
		//	}
		//}
	}
	catch (Exception ex)
	{
		message = ex.Message;
	}
	return message;
}

static void Main(string[] args)
{
	var list = new List<string>();
	list.Add("a");
	list.Add("b");
	list.Add("c");

	WriteCollection(string.Empty, string.Empty, string.Empty, list);

	Console.ReadLine();
}
[/quote] 大侠,你这方法是对的,可以这么用,非常感谢你,分给你了!!!!
E次奥 2013-07-09
  • 打赏
  • 举报
回复
知道T是集合不难,难的是泛型集合自身的T没法控制啊!
火拼阿三 2013-07-09
  • 打赏
  • 举报
回复
引用 18 楼 porenasckx 的回复:
不要乱用T,当你方法定义了一个T,那么方法内部所有的T都成了一样的了,但是你的泛型List的T还不固定,所以这种方法不合适!
知道了,有没有能知道T是集合,并且能返回他的数据的方法啊!
E次奥 2013-07-09
  • 打赏
  • 举报
回复
不要乱用T,当你方法定义了一个T,那么方法内部所有的T都成了一样的了,但是你的泛型List的T还不固定,所以这种方法不合适!
火拼阿三 2013-07-09
  • 打赏
  • 举报
回复
引用 15 楼 porenasckx 的回复:
那还要看你的List<T>中的T是否是固定的.如果不固定那就不好办!
肯定不是固定的啊。。。
Mic_Gary 2013-07-09
  • 打赏
  • 举报
回复
引用 4 楼 lizhi3186575 的回复:
http://www.cnblogs.com/zhili/archive/2012/11/08/Generic_2.html 看看这个介绍
http://bbs.csdn.net/topics/390512755 ,大侠,帮个忙吧!!!
E次奥 2013-07-09
  • 打赏
  • 举报
回复
那还要看你的List<T>中的T是否是固定的.如果不固定那就不好办!
火拼阿三 2013-07-09
  • 打赏
  • 举报
回复
其实我还有一个更麻烦的问题,我看了论坛许多,发现无解了,只能用最死的方法。。
火拼阿三 2013-07-09
  • 打赏
  • 举报
回复
引用 12 楼 liuyilin777 的回复:
这样写不知道行不行?
liuyilin777 2013-07-09
  • 打赏
  • 举报
回复
这样写不知道行不行?
火拼阿三 2013-07-09
  • 打赏
  • 举报
回复
引用 10 楼 jiaoshiyao 的回复:
小伙 这样的封装都会 期待你的明天!
小弟是菜鸟,大神帮帮我
jiaoshiyao 2013-07-09
  • 打赏
  • 举报
回复
小伙 这样的封装都会 期待你的明天!
火拼阿三 2013-07-09
  • 打赏
  • 举报
回复
引用 7 楼 sqlchen 的回复:

		public static string WriteCollection<T>(String connstr, String databaseName, String collectionName, IList<T> t)
		{
			String Message = string.Empty;
			try
			{
				using (Mongo_db = new MongoDBHelper(connstr, DatabaseName))
				{
					if (t != null)
					{
						Mongo_db.Insert<T>(t, CollectionName);
					}
				}
			}
			catch (Exception ex)
			{
				Message = ex.Message;
			}
			return Message;
		}

// 调用
List<M_Personal> modelList = new List<M_Personal>();
Message = WriteDB.WriteCollection<M_Personal>;("127.0.0.1", "table1", "table3", modelList);
这样写不知道行不行?
这样写了的话,后台重载的方法不会区分是List<T>还是T,他都当T传了。。。
火拼阿三 2013-07-09
  • 打赏
  • 举报
回复
我现在已经 IList<T> obj = (IList<T>)AssemClass.CreateGeneric(typeof(List<>),typeof(T)); 动态创建泛型List<T>,难道还要动态创建T,然后找出T的所有值给T,然后再List<T>.add(T)?
sqlchen 2013-07-09
  • 打赏
  • 举报
回复

		public static string WriteCollection<T>(String connstr, String databaseName, String collectionName, IList<T> t)
		{
			String Message = string.Empty;
			try
			{
				using (Mongo_db = new MongoDBHelper(connstr, DatabaseName))
				{
					if (t != null)
					{
						Mongo_db.Insert<T>(t, CollectionName);
					}
				}
			}
			catch (Exception ex)
			{
				Message = ex.Message;
			}
			return Message;
		}

// 调用
List<M_Personal> modelList = new List<M_Personal>();
Message = WriteDB.WriteCollection<M_Personal>;("127.0.0.1", "table1", "table3", modelList);
这样写不知道行不行?
火拼阿三 2013-07-09
  • 打赏
  • 举报
回复
引用 4 楼 lizhi3186575 的回复:
http://www.cnblogs.com/zhili/archive/2012/11/08/Generic_2.html 看看这个介绍
谢谢你,我看了,网上也看了很多,能看下我需要的吗,我的T是List集合,能否告诉我怎么搞。。
火拼阿三 2013-07-09
  • 打赏
  • 举报
回复
引用 3 楼 yzzhouyuefeng 的回复:
好长时间不用了 记得要用到 GetType() 帮顶把。。。
GetType()用到了,小弟对着方面用的少,了解的不多,希望大神指导下。。
人生导师 2013-07-09
  • 打赏
  • 举报
回复
http://www.cnblogs.com/zhili/archive/2012/11/08/Generic_2.html 看看这个介绍
yzzhouyuefeng511 2013-07-09
  • 打赏
  • 举报
回复
好长时间不用了 记得要用到 GetType() 帮顶把。。。
火拼阿三 2013-07-09
  • 打赏
  • 举报
回复
因为我想做成一个通用的方法,所以写在一起了,不写在一起时很简单。。
加载更多回复(2)

111,096

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧