优化构造函数调用

时间:2015-10-26 09:25:17

标签: c# .net

我正在使用以下方法创建类的原始实例:

FormatterServices.GetUninitializedObject

稍后我填充实例的数据并使用:

执行无参数构造函数
paremeterlessCtor.Invoke(instance, null);

我只是调用无参数构造函数,以便用户控制对象的初始化过程。但这两个功能的问题是昂贵的(是的,我把它们计时了)。我以前有一个优化版本,但没有用户控制对象的初始化和缓存代理而不是直接调用Invoke(以避免反射),我需要调用构造函数{{1} }类型,而不是ContructorInfo,所以我不能让一个代表,我不能做MethodInfo。那么我怎么能避免使用Invoke重载来调用构造函数呢?

还有其他方法比pre compiled expression更有效吗?

感谢。

编辑:原始实例是在运行时为ORM库解析的类型,而不是我需要一个,但我想重新发明轮子并完成所有操作,但我只是想优化Invoke ctor以避免反射(如果可能)。我知道我可以为此创建一个Initiliaze方法,但我感觉构造函数在语义上更适合用户在映射完成时的初始化过程。

如果需要了解我需要优化的内容,请使用一些格式化的代码:

GetUninitializedObject

1 个答案:

答案 0 :(得分:3)

我曾经创建过这个方法来创建一个构造函数的委托。它不是100%的解决方案,但可能会给你一个开始。我今天晚些时候会编辑这个答案!

*编辑*

最后,它有效(使用op op OP!):

public static Action<T> CreateDelegate<T>(this ConstructorInfo constructor)
    where T: class
{
    if (constructor == null)
        throw new ArgumentNullException("constructor");

    // Create the dynamic method
    DynamicMethod method = new DynamicMethod(
        constructor.DeclaringType.Name + "_" + Guid.NewGuid().ToString().Replace("-", ""),
        typeof(void),
        new[] { typeof(T) },
        constructor.Module,
        true);


    // Create the il
    ILGenerator ilGenerator = method.GetILGenerator();
    ilGenerator.Emit(OpCodes.Ldarg_0); // Copy the reference to the instance on the stack.
    ilGenerator.Emit(OpCodes.Call, constructor); // Call the constructor.
    ilGenerator.Emit(OpCodes.Ret); 

    // Return the delegate :)
    return (Action<T>)method.CreateDelegate(typeof(Action<T>));
}