代码之家  ›  专栏  ›  技术社区  ›  Tamas Czinege

从GUID获取类型

  •  12
  • Tamas Czinege  · 技术社区  · 16 年前

    Type.GUID 唯一地标识一个类型。不幸的是,我找不到任何方法来查找基于此GUID的类型。有 Type.GetTypeFromCLSID() 但根据我对文档(和实验)的理解,这做了一些非常非常不同的事情。

    编辑 :我忘了提到我真的想要一个固定宽度的“类型指纹”,这就是为什么GUID对我如此有吸引力。当然,在一般情况下,类型的完全限定名将起作用。

    7 回复  |  直到 16 年前
        1
  •  4
  •   Peter Wone    16 年前

    不要循环进行比较。填充 Dictionary<Type> Contains 方法。

    Dictionary<Type> types = new Dictionary<Types>();
    ... //populate 
    
    if (types.Contains(someObject.GetType())) 
      //do something
    

        2
  •  7
  •   Remus Rusanu    16 年前

    为什么不使用指定的财产呢。 AssemblyQualifiedName

    GUID用于COM互操作。

        3
  •  5
  •   Joe Enzminger    15 年前

    这可能只是已经发布的答案的摘要,但我认为如果不首先构建Guid->类型。

    我们在初始化框架中执行此操作:

    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   
            }
        }
    

    处理AssemblyLoad事件会处理动态加载的程序集。

        4
  •  1
  •   Rubens Farias    16 年前

    Generating Deterministic GUIDs ):

    private Guid GetDeterministicGuid(string input)
    {
        // use MD5 hash to get a 16-byte hash of the string:
        MD5CryptoServiceProvider provider = new MD5CryptoServiceProvider();
        byte[] inputBytes = Encoding.Default.GetBytes(input);
        byte[] hashBytes = provider.ComputeHash(inputBytes);
    
        // generate a guid from the hash:
        Guid hashGuid = new Guid(hashBytes);
        return hashGuid;
    }
    

    把它扔进去 typeof().AssemblyQualifiedName Dictionary<string, Guid> 收藏(或者,不管怎样,收藏) <Guid, string>

    这样,您将始终拥有相同的 GUID 对于给定类型(警告:可能发生碰撞)。

        5
  •  0
  •   Serkan    16 年前

    public interface ICachable
    {
        Guid ClassId { get; }
    }
    
    public class Person : ICachable
    {
        public Guid ClassId
        {
            get {  return new Guid("DF9DD4A9-1396-4ddb-98D4-F8F143692C45"); }
        }
    }
    

        6
  •  0
  •   si618    16 年前

    Mono文档报告模块具有 Metadata heap of guids

    也许 Cecil 是否可以帮助您根据guid查找类型?虽然不确定,但有一个 GuidHeap

        7
  •  0
  •   Javier Balam    10 年前

    我将使用typeof(class).GUID在缓存字典中查找实例:

    private Dictionary<Guid, class> cacheDictionary { get; set; }
    

    public T Getclass<T>()
        {
            var key = typeof(T).GUID;
            var foundClass= cacheDictionary.FirstOrDefault(x => x.Key == key);
            T item;
            if (foundClass.Equals(default(KeyValuePair<Guid, T>)))
            {
                item = new T()
                cacheDictionary.Add(key, item);
            }
            else
                item = result.Value;
    
            return item;
        }
    

    我会对缓存使用单例模式,

    调用的代码如下所示:

       var cachedObject = Cache.Instance.Getclass<class>();