csharp Созданиеклассадинамически
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了csharp Созданиеклассадинамически相关的知识,希望对你有一定的参考价值。
public static class Kata
{
private static ModuleBuilder _builder;
private static ModuleBuilder BuildAssembly()
{
if (_builder != null)
return _builder;
AssemblyName assemblyName = new AssemblyName();
assemblyName.Name = "RuntimeAssembly";
AppDomain thisDomain = Thread.GetDomain();
var asmBuilder = thisDomain.DefineDynamicAssembly(
assemblyName, AssemblyBuilderAccess.Run);
var modBuilder = asmBuilder.DefineDynamicModule(
asmBuilder.GetName().Name, false);
_builder = modBuilder;
return _builder;
}
public static bool DefineClass(string className, Dictionary<string, Type> properties, ref Type actualType)
{
var builder = BuildAssembly();
var type = builder.GetType(className);
if (type != null)
{
actualType = type;
return false;
}
TypeBuilder typeBuilder = builder.DefineType(
className,
TypeAttributes.Public);
foreach (KeyValuePair<string, Type> keyValuePair in properties)
{
var propertyName = keyValuePair.Key;
string field = "_" + propertyName.ToLower();
FieldBuilder fieldBldr = typeBuilder.DefineField(field, keyValuePair.Value, FieldAttributes.Private);
PropertyBuilder propBldr =
typeBuilder.DefineProperty(propertyName, PropertyAttributes.HasDefault, keyValuePair.Value, null);
MethodAttributes getSetAttr =
MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig;
MethodBuilder getPropBldr =
typeBuilder.DefineMethod("get_" + propertyName, getSetAttr, keyValuePair.Value, Type.EmptyTypes);
ILGenerator getIL = getPropBldr.GetILGenerator();
getIL.Emit(OpCodes.Ldarg_0);
getIL.Emit(OpCodes.Ldfld, fieldBldr);
getIL.Emit(OpCodes.Ret);
MethodBuilder setPropBldr = typeBuilder.DefineMethod("set_" + propertyName, getSetAttr, null,
new Type[] {keyValuePair.Value});
ILGenerator setIL = setPropBldr.GetILGenerator();
setIL.Emit(OpCodes.Ldarg_0);
setIL.Emit(OpCodes.Ldarg_1);
setIL.Emit(OpCodes.Stfld, fieldBldr);
setIL.Emit(OpCodes.Ret);
propBldr.SetGetMethod(getPropBldr);
propBldr.SetSetMethod(setPropBldr);
}
actualType = typeBuilder.CreateType();
return true;
}
}
以上是关于csharp Созданиеклассадинамически的主要内容,如果未能解决你的问题,请参考以下文章
csharp Cравнитьзначениепеременнойсданнымиизсписка,найтислово,делатьзамену
scss зацикленнаяанимациядляспиннера。 $ b $bСоздаемпсевдо-элемент。 Здесьдостаточнонавешиватькласснаоб
sql Созданиерандомногословаизрусскихбуквзаданнойдлины
csharp Узнаёмпортинстансадляподключениядебаггера
La Sylphide 仙女
sh Длякаждойсделаннойправкибезкоммитапоказатьизмененныйучастоккодаиспросить,должнолиэтоизменениепопа