我使用 T4 进行代码生成以及泛型。两者都很好,各有利弊,并且适用于不同的目的。
就我而言,我使用 T4 基于数据库模式生成实体、DAL 和 BLL。但是,DAL 和 BLL 引用了我基于泛型和反射构建的 mini-ORM。所以我认为你可以并排使用它们,只要你保持控制并保持小而简单。
T4 生成静态代码,而泛型是动态的。如果您使用泛型,则使用反射,据说它的性能低于“硬编码”解决方案。当然你可以缓存反射结果。
关于“return new T();”,我使用这样的动态方法:
public class ObjectCreateMethod
{
delegate object MethodInvoker();
MethodInvoker methodHandler = null;
public ObjectCreateMethod(Type type)
{
CreateMethod(type.GetConstructor(Type.EmptyTypes));
}
public ObjectCreateMethod(ConstructorInfo target)
{
CreateMethod(target);
}
void CreateMethod(ConstructorInfo target)
{
DynamicMethod dynamic = new DynamicMethod(string.Empty,
typeof(object),
new Type[0],
target.DeclaringType);
ILGenerator il = dynamic.GetILGenerator();
il.DeclareLocal(target.DeclaringType);
il.Emit(OpCodes.Newobj, target);
il.Emit(OpCodes.Stloc_0);
il.Emit(OpCodes.Ldloc_0);
il.Emit(OpCodes.Ret);
methodHandler = (MethodInvoker)dynamic.CreateDelegate(typeof(MethodInvoker));
}
public object CreateInstance()
{
return methodHandler();
}
}
然后,我这样称呼它:
ObjectCreateMethod _MetodoDinamico = new ObjectCreateMethod(info.PropertyType);
object _nuevaEntidad = _MetodoDinamico.CreateInstance();