我想知道这些方法和工具是否会起作用。我的计划是在每个类型构建器的运行时定义和创建类的实例,然后通过自动化将它们映射到流畅的nhibernate。这可能吗?你的想法是什么?
示例:
private static ISessionFactory CreateSessionFactory(Type _type, Assembly a)
{
//Database config here...
ISessionFactory sessionFactory = Fluently.Configure()
.Database(cfg)
.Mappings(m => m.AutoMappings.Add(
AutoMap.Assembly(a)))
.ExposeConfiguration(BuildSchema)
.BuildConfiguration()
.BuildSessionFactory();
return sessionFactory;
}
private static void BuildSchema(Configuration config)
{
new SchemaExport(config)
.Create(true, false);
}
static void Main(string[] args)
{
AssemblyName aName = new AssemblyName("DynamicAssemblyExample");
AssemblyBuilder ab =
AppDomain.CurrentDomain.DefineDynamicAssembly(
aName,
AssemblyBuilderAccess.Run);
ModuleBuilder mb = ab.DefineDynamicModule(aName.Name);
TypeBuilder tb = mb.DefineType(
"MyDynamicType",
TypeAttributes.Public);
FieldBuilder fbNumber = tb.DefineField(
"_ID",
typeof(int),
FieldAttributes.Public);
PropertyBuilder pbNumber = tb.DefineProperty(
"ID",
PropertyAttributes.HasDefault,
typeof(int),
null);
MethodAttributes getSetAttr = MethodAttributes.Public |
MethodAttributes.SpecialName | MethodAttributes.HideBySig;
MethodBuilder mbNumberGetAccessor = tb.DefineMethod(
"get_ID",
getSetAttr,
typeof(int),
Type.EmptyTypes);
ILGenerator numberGetIL = mbNumberGetAccessor.GetILGenerator();
numberGetIL.Emit(OpCodes.Ldarg_0);
numberGetIL.Emit(OpCodes.Ldfld, fbNumber);
numberGetIL.Emit(OpCodes.Ret);
MethodBuilder mbNumberSetAccessor = tb.DefineMethod(
"set_ID",
getSetAttr,
null,
new Type[] { typeof(int) });
ILGenerator numberSetIL = mbNumberSetAccessor.GetILGenerator();
numberSetIL.Emit(OpCodes.Ldarg_0);
numberSetIL.Emit(OpCodes.Ldarg_1);
numberSetIL.Emit(OpCodes.Stfld, fbNumber);
numberSetIL.Emit(OpCodes.Ret);
pbNumber.SetGetMethod(mbNumberGetAccessor);
pbNumber.SetSetMethod(mbNumberSetAccessor);
Type t = tb.CreateType();
Activator.CreateInstance(t);
var sessionFactory = CreateSessionFactory(t, (Assembly) ab);
using (var session = sessionFactory.OpenSession())
{
using (var transaction = session.BeginTransaction())
{
}
}
}
结果是ISessionFactory sessionFactory = Fluently.Conf..
处的异常说:{动态程序集不支持调用的成员}