您的位置:首页 > 编程语言 > C#

C#如何根据字符串动态的创建对象(类)?

2011-12-06 13:03 471 查看
 
我要写的一个程序里面有一个List

程序类似如下:
C# code

interface IChar;
{
....
}

class A:person
{
...
}

class B:person
{
...
}

class C:person
{
...
}

class D:person
{
...
}

List<IChar> char= new List<IChar>();

如上所示...

IChar是公用的接口,ABCD都实现这个接口...

我希望这个List<IChar>在创建的时候能够通过我输入的一个字符串数组来实现动态的加载

比如我输入的字符串数组是{B,C}...那么这个char就只加载B,C这两个类的对象...

请问各位大虾如何实现???

我看的很多地方说什么用反射...

但是反射的机制我看得是云里雾里的...请各位不吝赐教
 
 
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP

回复次数:14<!-- | 浏览次数:358-->




GabrielCNMao
(GabrielCNMao)

等 级:


#1楼 得分:0回复于:2008-07-29 09:44:47

Type type = typeof(xx);

xx為你說輸入的類名。

這就是反射,簡單不?
 
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
精华推荐:如何把LPWSTR转换为 String^ 类型




peach5460
(桃子)

等 级:


#2楼 得分:0回复于:2008-07-29 09:51:53

Type type = typeof(xx); 

如果:

string s="A";

Type type = typeof(s);

type 不是System.String么?
 
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
精华推荐:★★★【分享C#源代码(数据工具和C#游戏程序)】★★★




wanghui0380
(放歌)

等 级:


#3楼 得分:3回复于:2008-07-29 09:59:50

可以不用反射的

可以用一个简单工厂类或者策略模式实现

 
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
精华推荐:26个字母组合算法--急




GhostAdai
(幽灵阿呆)

等 级:


#4楼 得分:3回复于:2008-07-29 10:00:02

Activator.CreateInstance(Type.GetType("你的类名"))

这样就能创建你指定的类名的对象。
 
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
精华推荐:ASP.NET怎么防止重复提交!!




GabrielCNMao
(GabrielCNMao)

等 级:


#5楼 得分:5回复于:2008-07-29 10:05:21

下面是一個例子,test就是你所輸入的類名,下面是實現用反射列出test類中所有的屬性和方法名:

你參考下

  Type type = typeof(test);

  foreach (Object att in type.GetCustomAttributes(true))

  {

  attributeTest attribute = att as attributeTest;

  if (attribute != null)

  {

  listBox1.Items.Add(attribute.m_str);

  }

  }

  foreach (MethodInfo att in type.GetMethods())

  {

  foreach (Object akk in att.GetCustomAttributes(true))

  {

  attributeTest attribute = akk as attributeTest;

  if (attribute != null)

  {

  listBox1.Items.Add(attribute.m_str);

  }

  }

  }
 
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
精华推荐:"精通"C#的进来回答面试题,看自己有多“精”~~~~~~~~~`




GabrielCNMao
(GabrielCNMao)

等 级:


#6楼 得分:0回复于:2008-07-29 10:06:54

attributeTest 繼承了Attribute
 
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP




yuyu622
(流泪的鱼)

等 级:


#7楼 得分:2回复于:2008-07-29 10:09:42

Type.GetConstructor("")
 
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP




kingthy

等 级:


#8楼 得分:7回复于:2008-07-29 10:22:51

上面的都是误人子弟!!字符串哪来真实的Type?

反射动态创建对象:

如果A,B,C,D都与执行代码同一个程序集.则可以这样调用

System.Reflection.Assembly.GetExecutingAssembly().CreateInstance("命名空间.类名", false);

如:

object o = System.Reflection.Assembly.GetExecutingAssembly().CreateInstance("MyNameSpace.A", false);

不同程序集的话.则要装载调用.如下:

System.Reflection.Assembly.Load("程序集名称").CreateInstance("命名空间.类名", false);

如:

object o = System.Reflection.Assembly.Load("MyDll").CreateInstance("MyNameSpace.A", false);

动态创建后再将o强制转换为IChar接口,如下:

IChar ichar = o as IChar;

如果转换失败则ichar为null值.这样楼主明白了吧?
 
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP




lhsxsh
(林大海)

等 级:


#9楼 得分:0回复于:2008-07-29 10:31:36

mark
 
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP




GhostAdai
(幽灵阿呆)

等 级:


#10楼 得分:0回复于:2008-07-29 10:33:57

引用 8 楼 kingthy 的回复:

上面的都是误人子弟!!字符串哪来真实的Type?

喂喂喂,看清楚我的,和你的没啥区别吧,别一竿子打翻一船人啊!
 
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP




CsToD
(CsToD)

等 级:


#11楼 得分:0回复于:2008-07-29 12:56:26

引用 10 楼 GhostAdai 的回复:

喂喂喂,看清楚我的,和你的没啥区别吧,别一竿子打翻一船人啊!

哈哈,你受委屈了
 
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP




peach5460
(桃子)

等 级:


#12楼 得分:0回复于:2008-07-29 16:58:36

呵呵,谢谢各位大虾了...

PS:三楼:简单工厂不是需要switch..case么,好麻烦,呵呵...

还是八楼比较正确...光类名没用,还要写上命名空间才能识别出来...

的确是Activator.CreateInstance(Type.GetType("你的类名"))
 
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP




gxpotato
(gxpotato)

等 级:


#13楼 得分:0回复于:2009-12-12 23:22:09

MARK
 
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP




cs10823268
(cs10823268)

等 级:


#14楼 得分:0回复于:2011-05-05 15:40:07

我看你们说的都不行,

object o = Activator.CreateInstance(Type.GetType("你的类名")) ;

虽然创建了实例,但是还是装箱在obj,不拆箱还是不能用啊

比如

Person p = new Person();

p.Name = "张三";//这个ok大家都知道。

object o = Activator.CreateInstance(Type.GetType("Person")) ;

o.Name = "张三";//编译不能通过。

楼主的意思明显是怎么样在已知

string s = "Person";

的情况下,通过

object o = 某种办法(s);

或者

s.某种方法(某种参数);

获取到一个可以

o.Name = "张
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: