C#动态创建属性
来源:互联网 发布:微信域名屏蔽查询接口 编辑:程序博客网 时间:2024/06/05 10:26
PropertyGrid是个很有趣的控件。
只需要一个语句,就能实现许多功能。
尤其在开发工具类软件时,非常有用。
启先,想做个能够把一个XML节点用PropertyGrid来显示的控件。
把XML结点的属性值都列在PropergyGrid上。经过一段时间摸索,做成了。
结果却因为效率问题并未使用,如在效率不是问题的情况下应该还是能用的。
核心函数放在这里,供有需要的人参考吧。
private object CreateDynamicXMLPropertyClass(XmlNode objXMLNode)
...{
object objReturn;
string strDynamicAssemblyName = "XMLViewerRunTimeClassAssembly";
string strDynamicModuleName = "XMLViewerRunTimeModule";
string strDynamicClassName = "XMLViewerRunTimeClass" + DateTime.Now.Ticks.ToString();
string strPropertyName = string.Empty;
Type typeDynamic = null;
FieldInfo fieldInfo = null;
AppDomain currentDomain = null;
TypeBuilder typeBuilder = null;
ILGenerator ilGenerator = null;
AssemblyName assemblyName = null;
FieldBuilder fieldBuilder = null;
ModuleBuilder moduleBuilder = null;
MethodBuilder methodBuilder = null;
PropertyBuilder propertyBuilder = null;
AssemblyBuilder assemblyBuilder = null;
MethodAttributes getSetAttr;
Type[] methodArgs = ...{ typeof(string) };
IEnumerator objAttributes = null;
currentDomain = AppDomain.CurrentDomain;
assemblyName = new AssemblyName();
assemblyName.Name = strDynamicAssemblyName;
//Define a Dynamic Assembly
assemblyBuilder = currentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
//Define a Dynamic Module
moduleBuilder = assemblyBuilder.DefineDynamicModule(strDynamicModuleName);
//Define a runtime class with specified name and attributes.
typeBuilder = moduleBuilder.DefineType(strDynamicClassName, TypeAttributes.Public);
if (objXMLNode.Attributes != null)
...{
objAttributes = objXMLNode.Attributes.GetEnumerator();
while (objAttributes.MoveNext())
...{
XmlAttribute objXMLAttribute = (XmlAttribute)objAttributes.Current;
strPropertyName = objXMLAttribute.Name;
// Add the class variable, such as "m_strIPAddress"
fieldBuilder = typeBuilder.DefineField("m_str" + strPropertyName, typeof(string), FieldAttributes.Public);
propertyBuilder = typeBuilder.DefineProperty(strPropertyName, System.Reflection.PropertyAttributes.HasDefault, typeof(string), null);
getSetAttr = MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig;
methodBuilder = typeBuilder.DefineMethod("get_" + strPropertyName, getSetAttr, typeof(string), Type.EmptyTypes);
ilGenerator = methodBuilder.GetILGenerator();
ilGenerator.Emit(OpCodes.Ldarg_0);
ilGenerator.Emit(OpCodes.Ldfld, fieldBuilder);
ilGenerator.Emit(OpCodes.Ret);
propertyBuilder.SetGetMethod(methodBuilder);
methodBuilder = typeBuilder.DefineMethod("set_" + strPropertyName,
MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.SpecialName,
typeof(void), methodArgs);
ilGenerator = methodBuilder.GetILGenerator();
ilGenerator.Emit(OpCodes.Ldarg_0);
ilGenerator.Emit(OpCodes.Ldarg_1);
ilGenerator.Emit(OpCodes.Stfld, fieldBuilder);
ilGenerator.Emit(OpCodes.Ret);
propertyBuilder.SetSetMethod(methodBuilder);
}
}
// Add the class variable, such as "m_strIPAddress"
strPropertyName = "XMLSource";
fieldBuilder = typeBuilder.DefineField("m_str" + strPropertyName, typeof(string), FieldAttributes.Public);
propertyBuilder = typeBuilder.DefineProperty(strPropertyName, System.Reflection.PropertyAttributes.HasDefault, typeof(string), null);
getSetAttr = MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig;
methodBuilder = typeBuilder.DefineMethod("get_" + strPropertyName, getSetAttr, typeof(string), Type.EmptyTypes);
ilGenerator = methodBuilder.GetILGenerator();
ilGenerator.Emit(OpCodes.Ldarg_0);
ilGenerator.Emit(OpCodes.Ldfld, fieldBuilder);
ilGenerator.Emit(OpCodes.Ret);
propertyBuilder.SetGetMethod(methodBuilder);
//methodBuilder = typeBuilder.DefineMethod("set_" + strPropertyName,
// MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.SpecialName,
// typeof(void), methodArgs);
//ilGenerator = methodBuilder.GetILGenerator();
//ilGenerator.Emit(OpCodes.Ldarg_0);
//ilGenerator.Emit(OpCodes.Ldarg_1);
//ilGenerator.Emit(OpCodes.Stfld, fieldBuilder);
//ilGenerator.Emit(OpCodes.Ret);
//propertyBuilder.SetSetMethod(methodBuilder);
//Create Class
typeBuilder.CreateType();
typeDynamic = moduleBuilder.GetType(strDynamicClassName);
//Create Class Instance
objReturn = Activator.CreateInstance(typeDynamic, null, null);
if (objAttributes != null)
...{
objAttributes.Reset();
while (objAttributes.MoveNext())
...{
XmlAttribute objXMLAttribute = (XmlAttribute)objAttributes.Current;
strPropertyName = objXMLAttribute.Name;
fieldInfo = typeDynamic.GetField("m_str" + strPropertyName);
fieldInfo.SetValue(objReturn, objXMLAttribute.Value);
}
}
// Keep the source of XML
strPropertyName = "XMLSource";
fieldInfo = typeDynamic.GetField("m_str" + strPropertyName);
fieldInfo.SetValue(objReturn, objXMLNode.OuterXml);
return objReturn;
}
- C#动态创建属性
- C#动态创建属性
- C#动态创建属性
- C# 动态创建组件(属性及事件)
- 动态添加属性 C#
- C#动态添加属性
- C#创建动态数组
- C#动态创建数组
- C#动态创建菜单
- C# 动态创建控件
- C# 动态创建DataTable
- C#创建动态数组
- C# 动态创建窗体
- C#动态创建菜单
- C# 动态创建DataTable
- C#动态创建数据库
- C#动态创建DataTable
- c#动态创建控件...
- js取得cookie值的函数
- 异步刷新Browser的两种方法
- 页面定时刷新javascript
- 删除某图层下的Selected要素
- 产品质量的基石——微软Bug管理
- C#动态创建属性
- 關於基於WinCE下的聲音系統調試的一些經驗總結之驱动程式部分(二)
- vs2008中自带的MicrosoftReportViewer,传参数、动态查询数据问题
- 拍打运动可增进新陈代谢提高免疫力(动作详解)
- 兼容IE6,IE7,火狐Firefox多款浏览器的日期(日历)选择器特效,不会被SELECT挡住
- 用户 'sa' 登录失败。原因: 未与信任 SQL Server 连接 的解决方法
- simple router over Server2003
- 中移动接受P2P开放模式重构互联网
- 未完待续