c# 中怎么实现类型不确定的泛型参数

marjay 2011-11-09 10:06:22
    
static void GetModelList<T>(List<T> listT)
{
foreach (T p in listT)
{

}
}


我想定义一个类似于上面的方法,其参数是一个泛型集合,但是这个泛型集合的参数类型是不确定的。
传了一个这样的集合

static void Main()
{
//创建Person对象
TEST p1 = new TEST("张三", "1", 30);
TEST p2 = new TEST("李四", "2", 20);
TEST p3 = new TEST("王五", "3", 50);
//创建类型为Person的对象集合
List<TEST> persons = new List<TEST>();
//将Person对象放入集合
persons.Add(p1);
persons.Add(p2);
persons.Add(p3);

GetModelList<TEST>(persons);
}

传值进来之后,该怎么取得这个泛型集合中各个项目的值呢?
我在foreach里边用p.XXX 什么都点不出来
但是在监视框里却能看到各项目的值。。。

除了点出来的,还有其他什么方法可以用么?

...全文
2534 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Daqing 2011-11-10
  • 打赏
  • 举报
回复
                    foreach (T p in listT)
{
foreach (PropertyInfo pinfo in typeof(T).GetProperties())
{
Console.Write(pinfo.Name+":"+pinfo.GetValue(p, null));
Console.WriteLine();
}

}
获取值可以,但是你要返回对象就难了,所以你这个方法不靠谱
机器人 2011-11-10
  • 打赏
  • 举报
回复
你这样别用泛型了,用基类吧
Daqing 2011-11-10
  • 打赏
  • 举报
回复
错误的理解了泛型使用场合,泛型是个未知对象,只能这个未知对象操作,不能对其未知对象属性操作,本来就未知,怎么可以和具体的对象一同对待?
泛型外可以通过转换得到,泛型内部不需要去做那些事情,通过反射也不行,因为反射其实就是实例化,那得到的将会是空。
Icedmilk 2011-11-10
  • 打赏
  • 举报
回复
为何会有这么怪异的想法

既然不确定类型,如何确定属性?
wanghui0380 2011-11-10
  • 打赏
  • 举报
回复
按lz的写法,T只有在调用的才知道,那么你现在非调用的设计期,那自然不知道是啥类型

一般两种方案

1.如果你确定这个操作就是针对test类型滴,那么请使用泛型约束定义,这样你就可以xx.yy点出来

2.如果你是针对任意类型,那么建议用action<T> 或者func<T> 委托出去,让调用者自己确定如何操作

比如:
static void GetModelList<T>(List<T> listT,Action<T> act)
{
foreach (var p in listT)
{
act(p);
}
}

GetModelList<TEST>(persons,p=>p.xxx=1);


宝_爸 2011-11-10
  • 打赏
  • 举报
回复
另外可以使用where。来限定类型
例如

public class MyGenericClass<T> where T : IComparable, new()
{
// The following line is not possible without new() constraint:
T item = new T();
}

这样,就可以在函数里使用item.CompareTo(...) 也可以new了。



参考
where (generic type constraint) (C# Reference)
http://msdn.microsoft.com/en-us/library/bb384067.aspx
宝_爸 2011-11-10
  • 打赏
  • 举报
回复
什么都出不来吗?

应该Object的几个函数还是可以用的吧。

原因大家都说了,因为不知道T是什么类型。

像你的代码

static void GetModelList<T>(List<T> listT)
{
foreach (T p in listT)
{
如果这里写
int i = p.Age;如果
GetModelList<int>就会有问题了。
}
}

因此你的情况不适合使用泛型。
vrhero 2011-11-09
  • 打赏
  • 举报
回复
你看到的都是VS反射出来的...基本上,如果需要大量反射操作就不应该用泛型,否则就是滥用泛型...

另外var也只是个3.0的语法糖而已,不可能让你“点”出来什么,因为T仍然是未知类型...
marjay 2011-11-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 qgqch2008 的回复:]

C# code
static void GetModelList<T>(List<T> listT)
{
foreach (var p in listT)
{

}
}
[/Quote]

那个。。俺用的2005 貌似var不出来?
marjay 2011-11-09
  • 打赏
  • 举报
回复
刚刚上图监视错东西了。。


因为要做一个共通方法,所以参数类型不确定。
不是要展示所有属性,只是要选择几个显示。
而每本机能要显示的属性也不一样,这样应该怎么办呢?
qgqch2008 2011-11-09
  • 打赏
  • 举报
回复
static void GetModelList<T>(List<T> listT)
{
foreach (var p in listT)
{

}
}
黄亮 2011-11-09
  • 打赏
  • 举报
回复
p的类型未知你当然点不出什么,关键看你需要什么,如果你统一调用某个方法或者属性,建议你继承一个类或者接口,如果你需要展示所有属性,你可以考虑用反射来解决。

111,113

社区成员

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

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

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