想继承windows控件并改造它,把控件的事件变成改控件的一个新属性(名称同事件名),目的是让用户可以编辑该属性(该属性为一个自定义类),在运行时有这个事件触发时能执行该属性的内部方法来改变此控件的状态。
所以想通过构造函数中反射该控件的所有事件,并动态添加属性。能这么做吗?
曾经尝试过Type t = ClassHelper.AddProperty(Type, List<ClassHelper.CustPropertyInfo>);来动态添加指定类的属性,但是通过这个方法已经把原来类给破坏掉了,连构造函数也变了,有没有办法ClassHelper.AddProperty在添加属性时继承原来的类?
所以想通过构造函数中反射该控件的所有事件,并动态添加属性。能这么做吗?
曾经尝试过Type t = ClassHelper.AddProperty(Type, List<ClassHelper.CustPropertyInfo>);来动态添加指定类的属性,但是通过这个方法已经把原来类给破坏掉了,连构造函数也变了,有没有办法ClassHelper.AddProperty在添加属性时继承原来的类?
TypeBuilder myTypeBuilder = myModBuilder.DefineType(classType.FullName, TypeAttributes.Public, classType);//classType为原来的类
Type retval = myTypeBuilder.CreateType();通过上面代码可以继承原来的类,但是好像是通过无参数的构造函数继承的,因为我在运行Type t = ClassHelper.AddPropertyEx(typeof(Class1), lcpi);
object o = Activator.CreateInstance(t,"s");//“s”是基类带参数的构造函数public Class1(string a)但是报错:Constructor on type 'WindowsFormsApplication1.Class1' not found.
说没有找到这种类型的构造函数。求答
public event Action<bool> ValueChanged;
public bool IsChanged
{
get
{
return _isChanged;
}
set
{
_isChanged = value;
if(ValueChanged != null) ValueChanged(value);
}
}
思路一:在构造函数中能否增加该类的属性?(我觉得好像不行,不知道各位有没有想法)
思路二:动态类继承我想在的控件比如ButtonEx(继承了BUTTON类),但是构造方法有参数,不知道怎么在创建动态类的时候继承ButtonEx的构造方法。如果大家能回答我上面的两个问题,二选一,我就给分。呵呵,参与有奖
public static Type AddPropertyToTypeEx(Type classType, List<CustPropertyInfo> lcpi)
{
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(classType.FullName, TypeAttributes.Public, classType);
ConstructorInfo[] cis = classType.GetConstructors();
ConstructorInfo theCi = null;
ParameterInfo[] cpis = null;
Type[] types;
foreach (ConstructorInfo ci in cis)
{
AddConstructorToTypeBuilder(myTypeBuilder, ci);
}
Type retval = myTypeBuilder.CreateType();
//保存程序集,以便可以被Ildasm.exe解析,或被测试程序引用。
myAsmBuilder.Save(myAsmName.Name + ".dll");
return retval;
} private static void AddConstructorToTypeBuilder(TypeBuilder myTypeBuilder, ConstructorInfo ci)
{
ILGenerator custNameIL;
ParameterInfo[] pis = ci.GetParameters();
Type[] types = new Type[pis.Length];
for (int i = 0; i < pis.Length; i++)
{
types[i] = pis[i].ParameterType;
}
ConstructorBuilder cBuilder = myTypeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.HasThis, types);
custNameIL = cBuilder.GetILGenerator();
custNameIL.Emit(OpCodes.Ldarg_0);
custNameIL.Emit(OpCodes.Ldarg_1);
custNameIL.Emit(OpCodes.Stfld, ci);
custNameIL.Emit(OpCodes.Ret);
}调用时 Type t = ClassHelper.AddPropertyEx(typeof(Class1), lcpi);
object o = Activator.CreateInstance(t, "s");返回的TYPE在创建实例时报错:
Exception has been thrown by the target of an invocation.
AddConstructorToTypeBuilder这个函数是否哪里写的不对?
再问