有关使用反射来动态生成类一个继承与StringConverter类的问题

问题描述

我使用propertygrid控件来显示多值的属性,即在其中以combobox显示信息,所以会使用类适于[TypeConverter(typeof(Wage))]的语句加在指定的属性上面。但是像这样包含上面语句的类是动态生成的,即用System.Reflection.emt中的类来生成的,所以我使用属性的方法TypemultiConverter=DynamicMulitClassAnalyzer.m_instance.CreateMultiType(multiValuePropertysc.m_sProperyName,multiValuePropertysc.m_value);ci=typeof(TypeConverterAttribute).GetConstructor(newType[]{typeof(Type)});CustomAttributeBuildertypeConvertAttrBuilder=newCustomAttributeBuilder(ci,newobject[]{multiConverter});propertyBuilder.SetCustomAttribute(typeConvertAttrBuilder);而那个继承StringConverter的那个动态生成的类的生成方法,我写成下面这样:internalclassDynamicMulitClassAnalyzer{publicstaticreadonlyDynamicMulitClassAnalyzerm_instance=newDynamicMulitClassAnalyzer();privateArrayListm_valueArray=null;privateDynamicMulitClassAnalyzer(){}publicTypeCreateMultiType(stringsPropertyName,ArrayListvalueArray){m_valueArray=valueArray;AppDomainappDomain=Thread.GetDomain();//得到当前的应用程序域AssemblyNameasmName=this.GetType().Assembly.GetName();AssemblyBuilderasmBuilder=appDomain.DefineDynamicAssembly(asmName,AssemblyBuilderAccess.Run);ModuleBuildermoduleBuilder=asmBuilder.DefineDynamicModule("XBasis");stringsClassName=string.Format("Multi{0}",sPropertyName);TypeBuildertypeBuilder=moduleBuilder.DefineType(sClassName,TypeAttributes.Class|TypeAttributes.Public,typeof(StringConverter));AddMethodImp(typeBuilder,"GetStandardValuesSupported",newGenerateCodeOp(GetStandardValuesSupportedImp));//AddMethodImp(typeBuilder,"GetStandardValuesExclusive",newGenerateCodeOp(GetStandardValuesExclusiveImp));//AddMethodImp(typeBuilder,"GetStandardValues",newGenerateCodeOp(GetStandardValuesImp));returntypeBuilder.CreateType();}privatevoidAddMethodImp(TypeBuildertypeBuilder,stringsOverideMethodName,GenerateCodeOpgcOP){MethodInfoMethodDl=typeof(StringConverter).GetMethod(sOverideMethodName,newType[]{typeof(ITypeDescriptorContext)});MethodBuilderMethodImp=typeBuilder.DefineMethod(sOverideMethodName,MethodDl.Attributes|MethodAttributes.Public,MethodDl.CallingConvention,MethodDl.ReturnType,newType[]{typeof(ITypeDescriptorContext)});if(null!=gcOP){gcOP(MethodImp);}typeBuilder.DefineMethodOverride(MethodImp,MethodDl);}privatevoidGetStandardValuesSupportedImp(MethodBuilderMethodImp){ILGeneratorilGen=MethodImp.GetILGenerator();ilGen.Emit(OpCodes.Ldc_I4,1);ilGen.Emit(OpCodes.Ret);}privatevoidGetStandardValuesImp(MethodBuilderMethodImp){ILGeneratorilGen=MethodImp.GetILGenerator();ConstructorInfoci=typeof(StringConverter.StandardValuesCollection).GetConstructor(newType[]{typeof(ArrayList)});ilGen.Emit(OpCodes.Ldobj,m_valueArray.GetType());ilGen.Emit(OpCodes.Newobj,ci);ilGen.Emit(OpCodes.Stloc_0);ilGen.Emit(OpCodes.Ret);}privatevoidGetStandardValuesExclusiveImp(MethodBuilderMethodImp){ILGeneratorilGen=MethodImp.GetILGenerator();ilGen.Emit(OpCodes.Ldc_I4_1);ilGen.Emit(OpCodes.Ret);}delegatevoidGenerateCodeOp(MethodBuilderMethodImp);}但是我发现那个被添加的属性没有多值显示。而且经过我的测试,这个继承于StringConverter的类没有问题,我怀疑我的定制属性的那个部分语句写的有问题,我希望有相关的经验的人能够给予提示,在此表示感谢。

解决方案

解决方案二:
为什么不直接:[TypeConverter(DynamicMulitClassAnalyzer.m_instance.CreateMultiType(multiValuePropertysc.m_sProperyName,multiValuePropertysc.m_value))]
解决方案三:
直接[TypeConverter(DynamicMulitClassAnalyzer.m_instance.CreateMultiType(multiValuePropertysc.m_sProperyName,multiValuePropertysc.m_value))]试试
解决方案四:
问题是当前建立的那个属性也是动态生成的,所以不可以这么用
解决方案五:
关注
解决方案六:
没有人能给个好的建议吗,我时时在线等待呢
解决方案七:
我写了篇很简单的反射基本应用的文章以及反射在项目中实际使用的文章http://blog.csdn.net/go2newlife/archive/2007/11/27/1904687.aspx

时间: 2024-09-15 17:51:52

有关使用反射来动态生成类一个继承与StringConverter类的问题的相关文章

java-为什么不可能创建一个继承OnTouchListener的类?

问题描述 为什么不可能创建一个继承OnTouchListener的类? Android SDK在TouchEvent有一个接口(android.view.View.OnTouchListener).我不知道为什么下面这一行是错误的.Eclipse在OnTouchListener报错. public class TouchHandler extends OnTouchListener{ 如果我改为public interface TouchHandler extends OnTouchListen

从Java应用程序动态生成PDF文件

pdf|程序|动态 如果应用程序需要动态生成 PDF 文档,则需要 iText 库.开放源码的 iText 库使 PDF 文档的创建能够在瞬间完成.本文介绍了 iText 并提供了使用它从 Java ? 技术应用程序生成 PDF 文档的由浅入深的指南.我们创建了一个示例应用程序以更好地理解 iText. 很多应用程序要求动态生成 PDF 文档.这类应用程序包括银行生成用于电子邮件投递的客户报表,到读者购买特定图书章节并以 PDF 格式接收这些文档.例子罗列下去是很多的.在本文中,将使用 iTex

dom元素-无法获得动态生成的DOM元素

问题描述 无法获得动态生成的DOM元素 $(function(.....))是表示当网页加载完成后,此函数中的js内容才会执行. 可是我现在碰到一个问题. 网页原本的dom元素已经加载完成了,我现在动态生成了一个DOM元素,但在$(function(.....))无法获得刚生成的DOM元素.请问大家是怎么做的? 解决方案 // 创建一个p标签,document.createElement()的返回值就是生成的DOM,就是这里定义的p var p = document.createElement(

关于动态生成的表如何知道我当前选中的行列

问题描述 我动态生成了一个table,每一个cells里面放有linkButton,当我单击linkButton时,我怎么才能获取当前按钮所在cells的下表呢? 解决方案 解决方案二:所在cells的下表?解决方案三:所在行列的下标,也就是说我怎么知道当前单击的按钮在那一个单元格内!解决方案四:下标吧linkbutton的列应该是固定的,你添加到那一列就是那一列,比如说添加到第一列,那就是0了行的话,可以在放一个表示列放在第一列,记录行值,用的时候取就可以了,不想让他显示就隐藏起来解决方案五:

介绍一个简单的JavaScript类框架

  这篇文章主要介绍了一个简单的JavaScript类框架,有助于初学者理解JS类的创建与继承,需要的朋友可以参考下 在写work-in-progress JavaScript book一书时,对于javascript继承体系,我花费了相当的时间,并在该过程中研究了各种不同的模拟经典类继承的方案.这些技术方案中,我最为推崇的是base2与Prototype的实现. 从这些方案中,应该能提炼出一个具有其思想内涵的框架,该框架须具有简单.可重用.易于理解并无依赖等特点,其中简单性与可用性是重点.以下

JPanel继承问题... 写了一个类,继承自JPanel,但是控件不显示,跪求求各位大牛...

问题描述 JPanel继承问题... 写了一个类,继承自JPanel,但是控件不显示,跪求求各位大牛... 在做一个世界各个国家的时间的一个Demo.写了一个继承自JPanel类的panel,里面简单的设置了一个Logo,国家名字,还有一个按秒跳动时间,现在的问题就是在这个panel上的控件都不显示了,调了好久了也没有找到原因,所以没办法了,特来求助各位大牛们..... 话不多说,直接贴代码: package timerDemo; import java.awt.BorderLayout; im

介绍一个简单的JavaScript类框架_基础知识

 在写work-in-progress JavaScript book一书时,对于javascript继承体系,我花费了相当的时间,并在该过程中研究了各种不同的模拟经典类继承的方案.这些技术方案中,我最为推崇的是base2与Prototype的实现. 从这些方案中,应该能提炼出一个具有其思想内涵的框架,该框架须具有简单.可重用.易于理解并无依赖等特点,其中简单性与可用性是重点.以下是使用示例:   var Person = Class. extend ( { init: function (is

Python 进阶_OOP 面向对象编程_类和继承

目录 目录 类 最简单的类 类方法 构造器 __init__ 创建一个类 实例化一个对象 调用实例的方法和属性 创建子类 使用 super 来调用父类的构造器 实例化子类对象 调用子类的属性和方法 类属性方法的命名规则 类 类是实例的抽象, 实例是类的具体化. Python 中的类分为 经典类 和 新式类. 前者现在已经很少用到了, 其特点就是可以不需要继承任何父类:后者则刚好相反, 形式类必须至少有一个父类, 如果没有特定的父类需要继承时, 至少需要继承基类 object, 在后面给出例子.

类模板继承和部分具体化例子及非类型参数

模板类必须所有的方法定义放到一个文件中.因为模板类不是函数不能单独编译 template<typename T1,typename T2,int T3> class myext:public mybase<T2> 模板定义两个类型参数T1,T2,定义个非类型参数T3,他在使用期间如同一个常数.这个T3可以用来处理动态数组,并且继承了模板类mybase并且将类型参数T2赋予给他 template<typename T2,int T3> class myext<int