我有一个应用程序可以根据需要通过反射加载Type,因为实现可能会被配置更改。 这是一个示例代码:
var myObject = Activator.CreateInstance(Type.GetType("MyAssembly.MyClass, MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1r46a5dfa04dase2"))as IMyClass
我的问题是,这个Type默认是缓存的,或者每次都会重新加载,如果没有,我如何缓存它以提高性能?
答案 0 :(得分:0)
与实例不同,单个类型及其包含的程序集一旦使用就不会被卸载(假设只有一个AppDomain),所以基本上答案是肯定的,有一个缓存。
答案 1 :(得分:0)
加载后,无法卸载程序集(除非您卸载加载它的完整AppDomain)(请参阅例如How to unload an assembly from the primary AppDomain?)。所以你的问题就出现了相反的问题: - )
现在......你肯定可以加快一切:
Type myType = Type.GetType("MyAssembly.MyClass, MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1r46a5dfa04dase2");
每次都需要执行此调用。虽然不会加载程序集,但将在程序集中进行搜索。您可以缓存myType
。
var myObject = Activator.CreateInstance(myType) as IMyClass;
这将每次都为myType
搜索无参数构造函数。你可以通过缓存你需要的构造函数(myConstructor
)来加速这个:
ConstructorInfo myConstructor = myType.GetConstructor(Type.EmptyTypes);
var myObject = myConstructor.Invoke(null) as IMyClass;
现在......即使使用反射也很慢......你可以创建一个动态方法来调用构造函数并缓存它:
Func<IMyClass> myCreate = Expression.Lambda<Func<IMyClass>>(Expression.New(myConstructor)).Compile();
var myObject = myCreate();
所以最后你只能缓存myCreate
: - )