您的位置:首页 > 其它

如何反射创建泛型集合,例如Collection<T>,

2016-10-17 09:29 381 查看

请问如何反射创建泛型集合,例如Collection<T>,谢谢.-.NET技术/C#

如题,我是想通过反射去创建一个泛型集合,并且给这个集合添加值或者赋值,其中任意一种都可以. 有如下2个类,Person类和Department类,Department类中有一个Field(public Collection<Person> personlist = new Collection<Person>()),需求是其他项目工程的函数可以动态反射Department并且为personlist添加值,即personlist.add(Person)的方法,Person类和Department放在一个项目工程中,编译之后的DLL被拷贝到其他项目中使用,并在其他项目的方法中进行反射创建实例,并且为这个泛型集合天加数据项.

代码如下:

项目工程A

namespace PersonDll

{

  public class Person

  {

  public string Name

  {

  get;

  set;

  }

  }

  public class Department

  {

  public Collection<Person> personlist = new Collection<Person>();

  }

}

---------------------------------------

项目工程B:

class Program

  {

  static void Main(string[] args)

  {

  string path = @"D:\Project\CollectionObj\RecoverCollection\SampleDll\PersonDll.dll";

  Assembly assenbly = Assembly.LoadFile(path);

  object person = assenbly.CreateInstance("PersonDll.Person");

  object deparment = assenbly.CreateInstance("PersonDll.Department");

  Type deType = assenbly.GetType("PersonDll.Department");

  FieldInfo fi = deType.GetField("personlist");

  //此后再次进行GetType()也不能获取到Add方法

  //本意是想使用集合的Add方法,类似

  //Person p = new Person();

  //p.Name = "test";

  //personlist.Add(p);

//上面的fi即类似personlist的集合

  }

  }

-------------------

现在的问题就是到FieldInfo fi = deType.GetField("personlist");这一步之后,本来是想获取到fi.GetType().GetMethods()的相关Add方法,不过不能获取到,所以无法向这个Collection集合中添加数据,所以还请各位帮忙看下有什么方法可以动态的给这个泛型集合添加数据项进去.前提是必须动态加载DLL.谢谢.
------回答---------
------其他回答(50分)---------
C# code

Assembly assenbly = Assembly.LoadFile(path);
object person = assenbly.CreateInstance("PersonDll.Person");
TypeDescriptor.GetProperties(person)["Name"].SetValue(person, "张三");
object deparment = assenbly.CreateInstance("PersonDll.Department");
object personlist = deparment.GetType().GetField("personlist").GetValue(deparment);
personlist.GetType().InvokeMember("Add", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance, null, personlist,
new object[] { person });

如果用vs2010,可以用dynamic来做会方便很多
------回答---------

------其他回答(50分)---------

C# code

Assembly assenbly = Assembly.LoadFile(path);
object person = assenbly.CreateInstance("PersonDll.Person");
TypeDescriptor.GetProperties(person)["Name"].SetValue(person, "张三");
object deparment = assenbly.CreateInstance("PersonDll.Department");
object personlist = deparment.GetType().GetField("personlist").GetValue(deparment);
personlist.GetType().InvokeMember("Add", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance, null, personlist,
new object[] { person });

如果用vs2010,可以用dynamic来做会方便很多

相关资料:

c/c++C#如何读取8位位图的RGB值-.NET技术/C#
c/c++关于c#解析串口数据
c/c++access保存不了数据
c/c++请问如何反射创建泛型集合,例如Collection<T>,谢谢.-.NET技术/C#
c/c++简单算法,进者有分-.NET技术/C#
c/c++C#按钮单击事件去调用KEYDOWN问题-.NET技术/C#
c/c++.net中如何实现图形化对象之间的关系?-.NET技术/C#
请问如何反射创建泛型集合,例如Collection<T>,谢谢.-.NET技术/C#来源网络
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: