将ReflectionOnlyType与Type进行比较的推荐方法是什么?

时间:2015-09-02 11:18:20

标签: c# .net reflection .net-assembly

我已经意识到我无法直接将仅反射加载的程序集中的类型与typeof解析的类型进行比较,即使它们都来自同一个程序集。

我目前正在使用:  reflectionOnlyType.AssemblyQualifiedName == type.AssemblyQualifiedName

推荐的方式是什么?

2 个答案:

答案 0 :(得分:1)

这可能不是一个明确的答案,但它比评论中的内容要好一些。

刚刚问自己同样的问题,我确实从AQN等效开始作为第一步。问题在于,如果程序集未签名,则使用相同的AQN进行重复程序集是微不足道的。 (注意,我不是来自安全方面;如果您正在加载程序集,则不应该依赖此答案来防止在您的应用程序中执行错误代码)

另一种选择是使用Type.GUIDsome random people on the internet say是确定性生成的,但包含可由程序员控制的Type的属性。因此,碰撞的可能性仍然存在。 (这不应该用于安全目的)

似乎没有比上述更好的选择(如果我错了,请回答!)。如果您正在反映并从同一文件夹(例如,您的bin文件夹)加载,那么使用AQN就足够了。 Type.GUID为碰撞提供了更好的保护,并且感觉比使用字符串比较感觉更好

如果你真的真的需要知道,你可能不得不过分,比较两个包含程序集的加密哈希来验证它们是否相同,然后使用AQN比较和可能的其他属性类型。

答案 1 :(得分:1)

我通过使用我拥有的运行时类型加载System.ReflectionOnly类型来解决它。这似乎是最安全的方式:

// Comes from an assembly loaded as reflection only
var reflectionOnlyTypeFromSomeAssembly = GetItFromSomewhere();

// Comes from an assembly that is running
var reflectionOnlyTypeFromRuntimeType = 
        Type.ReflectionOnlyGetType(typeof(myType).AssemblyQualifiedName, false, true); 

// Now you can compare
if (reflectionOnlyTypeFromSomeAssembly == reflectionOnlyTypeFromRuntimeType) 
{
  // do something?
}