问题描述
我使用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