为什么不使用指定的财产,即.AssemblyQualifiedName?此属性记录为"可以持久化并稍后用于加载类型".
GUID用于COM互操作.
这可能只是已经发布的答案的摘要,但我认为如果不首先构建 Guid->Type 的映射,就没有办法做到这一点。
我们在初始化框架中这样做:
static TypeManager()
{
AppDomain.CurrentDomain.AssemblyLoad += (s, e) =>
{
_ScanAssembly(e.LoadedAssembly);
};
foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies())
{
_ScanAssembly(a);
}
}
private static void _ScanAssembly(Assembly a)
{
foreach (Type t in a.GetTypes())
{
//optional check to filter types (by interface or attribute, etc.)
//Add type to type map
}
}
Run Code Online (Sandbox Code Playgroud)
处理 AssemblyLoad 事件负责处理动态加载的程序集。
据我了解,Type.GUID 使用类型的程序集版本作为 Guid 生成算法的一部分。如果您增加程序集版本号,这可能会导致麻烦。根据您的应用程序,使用另一个答案中描述的 GetDeterministicGuid 方法可能是可取的。
不要循环比较。填充 aDictionary<Type>
并使用该Contains
方法。
Dictionary<Type> types = new Dictionary<Types>();
... //populate
if (types.Contains(someObject.GetType()))
//do something
Run Code Online (Sandbox Code Playgroud)
这肯定会给你一个固定大小的条目,因为它们都是对象引用(Type 的实例本质上是工厂对象)。
归档时间: |
|
查看次数: |
7699 次 |
最近记录: |