如何利用反射创建一个对象List?

ThinkingFatCat 2014-06-29 07:16:40
我的类结构如下:

public class MyClass1 {}
public class MyClass2 {}

public class TestClass {
public MyClass1 my1 {get; set;}
public List<MyClass2> myList2 {get; set;}
}


在一个通用的递归处理函数里面,传进来一个object类,可以是MyClass1,也可以是MyClass2或者TestClass
假设穿进来一个TestClass,遍历他的属性,创建相应的实例,用如下代码的话

public bool Func(Object obj)
{
Type t = obj.GetType();
PropertyInfo[] properties = t.GetProperties();
foreach (PropertyInfo p in properties)
{
var objPropertyValue = p.GetValue(obj, null);
if (objPropertyValue != null)
{
Type pType = objPropertyValue.GetType();
string pTypeName = pType.FullName;

//生成一个该属性的实例
object objProperty = pType.Assembly.CreateInstance(pTypeName);
//当这个实例是MyClass1的时候好办,直接转成MyClass1即可
//如果是List<T>的时候就不知道怎么转换成一个List<MyClass2>的实例了。。。

}
}

}


请指教。。。
...全文
1192 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
探索丶发现 2016-08-30
  • 打赏
  • 举报
回复
引用 8 楼 ThinkingFatCat 的回复:
List<typeName>里面能写变量名?我怎么报错啊?


string typeName = "EndToEndBlueprintRoot";
List<typeName> ll = new List<typeName>();


typeName,是让你写上类名的……
  • 打赏
  • 举报
回复
一个多月了,鄙视楼主不结贴
  • 打赏
  • 举报
回复
看看你类怎么定义的,根据你传过来的实体, 可以用type反射出它的实际类型,然后再创建它的集合实例
  • 打赏
  • 举报
回复
你这样肯定不行,一个是类型,一个是变量
  • 打赏
  • 举报
回复
真不知道你到底要干什么, public class Class1 <typeName> 这样定义 完全可以达到你的要求
ThinkingFatCat 2014-07-01
  • 打赏
  • 举报
回复
目前只能对付一下,把所有这些可能的类都继承一个共同父类,程序里写死生成一个List<该父类>
ThinkingFatCat 2014-07-01
  • 打赏
  • 举报
回复
动态的阿,我的typeName只能动态取到,编译的时候肯定不知道阿。 这种情况怎么办
ThinkingFatCat 2014-06-30
  • 打赏
  • 举报
回复
List<typeName>里面能写变量名?我怎么报错啊?

            string typeName = "EndToEndBlueprintRoot";
            List<typeName> ll = new List<typeName>();
  • 打赏
  • 举报
回复
我现在知道这个属性是个List<T>,在运行时我也能拿到这个T的名称,存在变量typeName中,那我应该怎么写代码创建一个 List<typeName>的实例呢? 你拿到T的名称后存到typeName中,在创建List<typeName> 实例,可以改下你的类,写个泛型类,用where约束你传过来的这个T,这样所有传过来的实体必须实例化, 例如, public class Class1 <T> where T : class, new() ,然后你就可以List<typeName> name=new List<typeName>()了 再根据PropertyInfo 对象 操作你的集合typeName
ThinkingFatCat 2014-06-30
  • 打赏
  • 举报
回复
引用 3 楼 caozhy 的回复:
google makegenerictype C# list
嗯,等我看看
ThinkingFatCat 2014-06-30
  • 打赏
  • 举报
回复
我现在知道这个属性是个List<T>,在运行时我也能拿到这个T的名称,存在变量typeName中,那我应该怎么写代码创建一个 List<typeName>的实例呢?
ThinkingFatCat 2014-06-30
  • 打赏
  • 举报
回复
引用 2 楼 sp1234 的回复:
8年前的一篇文章,你可以参考一下。http://www.cnblogs.com/ninputer/archive/2006/06/02/415458.html 其实这些在msdn帮助的地方都有,微软最不缺的就是正规的(甚至啰嗦的)文档,就是网上那些比较俗的博主抄这样的文章少一些而已。这就好像你到书店去看,畅销入门书几乎都是垃圾书,好书被驱逐到角落里没有基本。
推荐点.NET的好书呗。。。
threenewbee 2014-06-29
  • 打赏
  • 举报
回复
google makegenerictype C# list
  • 打赏
  • 举报
回复
8年前的一篇文章,你可以参考一下。http://www.cnblogs.com/ninputer/archive/2006/06/02/415458.html 其实这些在msdn帮助的地方都有,微软最不缺的就是正规的(甚至啰嗦的)文档,就是网上那些比较俗的博主抄这样的文章少一些而已。这就好像你到书店去看,畅销入门书几乎都是垃圾书,好书被驱逐到角落里没有基本。
bwangel 2014-06-29
  • 打赏
  • 举报
回复
泛型的反射比较费劲。通常如果是已知类型最好不要用反射。

110,566

社区成员

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

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

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