相关疑难解决方法(0)

快速创建对象而不是Activator.CreateInstance(type)

我正在努力提高应用程序的性能.我们有很多Activator.CreateInstance调用引起了一些悲伤.

我们基于一个接口(ITabDocument)实例化了很多类,在浏览后我想到了使用这段代码:

代码并不比使用我们拥有的Activator.CreateInstance代码更好(实际上稍慢).

    public static Func<T> CreateInstance<T>(Type objType) where T : class, new()
    {
        var dynMethod = new DynamicMethod("DM$OBJ_FACTORY_" + objType.Name, objType, null, objType);
        ILGenerator ilGen = dynMethod.GetILGenerator();
        ilGen.Emit(OpCodes.Newobj, objType.GetConstructor(Type.EmptyTypes));
        ilGen.Emit(OpCodes.Ret);
        return (Func<T>)dynMethod.CreateDelegate(typeof(Func<T>));
    }
Run Code Online (Sandbox Code Playgroud)

我想知道为什么会这样,我所做的只是:

ITabDocument document = CreateInstance<ITabDocument>(Type.GetType("[Company].Something"));
Run Code Online (Sandbox Code Playgroud)

是否有更好的方法来创建有助于上述内容的对象?当你不确定具体的类型时,它有点难.

c# reflection reflection.emit createinstance activator

31
推荐指数
4
解决办法
3万
查看次数

System.Activator.CreateInstance(T)的性能问题是否足以阻止我们随便使用它?

System.Activator.CreateInstance(T)方法是否有性能问题(因为我怀疑它使用反射)大到足以阻止我们随便使用它?

.net performance instantiation activator

30
推荐指数
4
解决办法
1万
查看次数

为什么在没有new()泛型类型约束的情况下允许Activator.CreateInstance <T>()?

在下面显示的示例代码中,"CompileError"方法将无法编译,因为它需要方法中where T : new()显示的约束CreateWithNew().但是,该CreateWithActivator<T>()方法在没有约束的情况下编译得很好.

public class GenericTests
{
    public T CompileError<T>() // compile error CS0304
    {
        return new T();
    }

    public T CreateWithNew<T>() where T : new() // builds ok
    {
        return new T();
    }

    public T CreateWithActivator<T>() // builds ok
    {
        return Activator.CreateInstance<T>();
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么是这样?

/sf/answers/115437591/,它引用MSDN文档,和这个问题时,new T()仿制药的表达实际上是实现使用Activator.CreateInstance<T>().所以我不明白为什么调用new T()要求泛型类型的约束方式在使用时可以省略Activator.CreateInstance<T>().

或者,以另一种方式提出问题:where T : new()如果T通过直接使用完全相同的底层基础架构,在没有约束的情况下在通用方法中创建实例很容易,那么约束的重点是什么?

.net c# generics activator type-constraints

10
推荐指数
1
解决办法
1198
查看次数

有没有办法重置DbContext而不处理和重新实例化?

我最近重构了一个WPF应用程序,以便它不再包含DbContext在using子句中的每次使用(请参阅此问题).相反,我的应用程序只使用相同的DbContext单例.

除了一个小问题外,这很有用.我有一个例程,从头开始重建数据库并插入一些默认数据.此例程直接使用ADO.NET(而不是DbContext),因此DbContext不知道数据库现在完全不同.

有没有一种方法来重置DbContext而不处理它?如果可能的话,我想避免处置,因为这会破坏整个应用程序中对原始单例的几个引用.

entity-framework entity-framework-4 entity-framework-4.1

9
推荐指数
2
解决办法
1万
查看次数