动态类帮助器

写的一个类帮助器,思路是,可以使用这个帮助器对类动态地控制(在运行时),如添加,删除其成员。

最近要用到这个,在网上找了点资料,也不全面,就自己查msdn帮助文件。自己写了一个,功能还不是很完善,如果大家有兴趣扩展下功能的话,就再好不过了。现在只能控制属性,还不能控制其它成员,如事件,方法等等。

演示一:动态生成类。
演示二:动态添加属性到类。
演示三:动态从类里删除属性。
演示四:动态获取和设置属性值。

类帮助器代码:

Code



 显示程序代码:

 

Code

 

输出:

ClassName 'MyClass'
Has Property 'System.String S1'
Has Property 'System.String S2'

ClassName 'MyClass'
Has Property 'Int32 I1'
Has Property 'Int32 I2'
Has Property 'System.String S1'
Has Property 'System.String S2'

ClassName 'MyClass'
Has Property 'Int32 I1'
Has Property 'Int32 I2'
Has Property 'System.String S2'

S2 = abcd
I2 = 1234


 

posted @ 2006-11-14 11:08 ShadowK 阅读(3162) 评论(23)  编辑 收藏 网摘

  回复  引用  查看    
#1楼2006-11-14 11:27 | dudu      
标题过长。
  回复  引用  查看    
#2楼[楼主]2006-11-14 11:30 | ShadowK      
@dudu
哦,不好意思,我改短点。

  回复  引用    
#3楼2006-11-14 12:43 | huanGe
能动态的给类添加方法吗
  回复  引用    
#4楼2006-11-14 13:09 | Shadowk[匿名][未注册用户]
@huanGe
还没有加这个功能。
不过可以实现的。

  回复  引用  查看    
#5楼2006-11-14 13:33 | kchen      
/**//// <summary>
/// 根据类的类型型创建类实例。
/// </summary>
/// <param name="t">将要创建的类型。</param>
/// <returns>返回创建的类实例。</returns>
public static object CreateInstance(Type t)
{
return Activator.CreateInstance(t);
}

  回复  引用  查看    
#6楼2006-11-14 13:34 | kchen      
/**//// <summary>
/// 根据类的类型型创建类实例。
/// </summary>
/// <param name="t">将要创建的类型。</param>
/// <returns>返回创建的类实例。</returns>
public static object CreateInstance(Type t)
{
return Activator.CreateInstance(t);
}

为什么不用Activator.CreateInstance<T>()呢?
这样可以取消Boxing和unboxing

  回复  引用  查看    
#7楼2006-11-14 13:53 | jhtchina      
Mark

  回复  引用  查看    
#8楼[楼主]2006-11-15 15:19 | ShadowK      
@kchen
这里好像不能用这个Activator.CreateInstance<T>()吧。
因为那个t 是动态生成的。而不像是string,int 等类型是强类型的。

如果可以,请把代码帖一个。我对这些不是很熟悉的。


  回复  引用    
#9楼2007-01-04 16:05 | soney[未注册用户]
我有两个问题,请教一下
1.能否实现动态的生成的这个类继承于指定的某个类
2.动态生成的这个类能否有序列化的标志

  回复  引用    
#10楼2007-01-15 21:57 | song[未注册用户]
我是新手,问个傻问题,我想用你这个东西做个转换器,也就是把用户提交过来的request对象中的所有数据动态地生成一个类,全部存入这个类,然后传到Nhibernate里去调用,请问怎么取出这些数据,存我想出来了 protected void ButtonLogin_Click(object sender, EventArgs e)
{
System.Web.HttpRequest request = this.Request;
new Action(request).execute();
}
public void execute()
{

string[] values = request.Form.AllKeys;
int count = request.Form.Count;
string[] _ClassName = new string[] { };
for (int i = 1; i < count; i++)
{
string arg1 = request.Form.GetKey(i);
if (arg1 == "FormName")
{
_ClassName = request.Form.GetValues(i);
break;
}
}
//动态生成类。
Type t = ClassHelper.BuildType(_ClassName[0]);
List<ClassHelper.CustPropertyInfo> lcpi = new List<ClassHelper.CustPropertyInfo>();
ClassHelper.CustPropertyInfo cpi;
//动态添加属性到类。
for (int i = 1; i < count; i++)
{
string arg1 = request.Form.GetKey(i);

//string types = request.Form.GetType;

string[] value1 = request.Form.GetValues(i);
string value = value1[0].ToString();
try
{
cpi = new ClassHelper.CustPropertyInfo("System.String", arg1);
lcpi.Add(cpi);
//再加入上面定义的属性到我们生成的类t。
t = ClassHelper.AddProperty(t, lcpi);

object o = ClassHelper.CreateInstance(t);

//给S2,I2属性赋值。
ClassHelper.SetPropertyValue(o, arg1, value);
//显示出来,测试用
Console.WriteLine("S2 = {0}", ClassHelper.GetPropertyValue(o, arg1));
}
catch (Exception e)
{
}
value = "";
}
LoginForm login = (LoginForm)t;
string name =login.getname();
string password = login.getpassword();

  回复  引用  查看    
#11楼2007-05-17 23:18 | 黄志强      
好东东.收藏先.
  回复  引用    
#12楼2007-05-18 08:49 | 预备役中尉
我写的,请多指教.用到企业库的builder
  回复  引用    
#14楼2007-05-18 14:04 | zoti[未注册用户]
收藏一下。
  回复  引用    
#15楼2007-05-21 21:42 | 雨天不在[未注册用户]
不错,好东西,正好用的上呢
  回复  引用    
#16楼2007-06-06 13:22 | cccc[未注册用户]
工作中还没用过 这个呢 感觉应该是好东西 ,谢谢

  回复  引用    
#17楼2008-02-29 15:25 | ghdqlz[未注册用户]
如果给生成的DLL加上命名空间?这样的话,我就可以动态生成一个DLL进行调用

AppDomain myDomain = Thread.GetDomain();
AssemblyName myAsmName = new AssemblyName();
myAsmName.Name = "MyDynamicAssembly";

//创建一个永久程序集,设置为AssemblyBuilderAccess.RunAndSave。
AssemblyBuilder myAsmBuilder = myDomain.DefineDynamicAssembly(myAsmName,
AssemblyBuilderAccess.RunAndSave);

//创建一个永久单模程序块。
ModuleBuilder myModBuilder =
myAsmBuilder.DefineDynamicModule(myAsmName.Name, myAsmName.Name + ".dll");
//创建TypeBuilder。
TypeBuilder myTypeBuilder = myModBuilder.DefineType(className,
TypeAttributes.Public);

//创建类型。
Type retval = myTypeBuilder.CreateType();

//保存程序集,以便可以被Ildasm.exe解析,或被测试程序引用。
//myAsmBuilder.Save(myAsmName.Name + ".dll");


  回复  引用    
#18楼2008-04-20 18:57 | coco[未注册用户]
学习中
  回复  引用    
#19楼2008-06-24 16:45 | eager eagle[未注册用户]
非常感谢,最近也正在研究这方面,可否交个朋友,多多指教!
  回复  引用    
#20楼2009-01-29 11:23 | mero[未注册用户]
创建出来的类型如果不想要了,应该如何删除掉呢,有没有什么方法?
  回复  引用    
#21楼2009-05-16 20:37 | qcrsoft[未注册用户]
我写动态类遇到个焦头烂额的问题:动态类继承于比如Class1,生成动态类的实例后,把实例转型成Class1然后访问某属性,访问的却是Class1的属性。比如:
Class1有个public virtual string Sex 属性
1、CreateInstance()生成动态类的实例obj
2、Class1 class1 = (Class)obj;
3、这时访问class1.Sex,指向的是Class1的Sex,却不是动态类的

为什么啊,哭死我了




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 560131 2cmZBuTa9XU=



相关文章:

相关链接: