Получите тип от GUID

По различным причинам я должен реализовать механизм кэширования типа в C#. К счастью, CLR обеспечивает Type.GUID однозначно определять тип. К сожалению, я не могу найти способ искать тип на основе этого GUID. Существует Type.GetTypeFromCLSID() но на основе моего понимания документации (и эксперименты), который делает что-то очень, очень отличающийся.

Там какой-либо путь состоит в том, чтобы получить тип на основе своего GUID за исключением цикличного выполнения через все загруженные типы и по сравнению с их GUID?

Править: Я забыл упоминать, что я действительно хотел бы "цифровой отпечаток типа" фиксированной ширины, вот почему GUID так обращается ко мне. В общем случае, конечно, работало бы полностью определенное название типа.

12
задан Tamas Czinege 12 January 2010 в 00:49
поделиться

5 ответов

Не зацикливайся на сравнении. Заполните Словарь и используйте метод Contains.

Dictionary<Type> types = new Dictionary<Types>();
... //populate 

if (types.Contains(someObject.GetType())) 
  //do something

Это, безусловно, даст вам запись фиксированного размера, так как все они будут ссылками на объекты (экземпляры Type, по сути, являются объектами фабрики).

3
ответ дан 2 December 2019 в 20:40
поделиться

Если вы контролируете эти классы, я бы порекомендовал:

public interface ICachable
{
    Guid ClassId { get; }
}

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

Вы можете генерировать ваши GUID, используя Visual Studio, Tools-> Create GUID.

0
ответ дан 2 December 2019 в 20:40
поделиться

Посмотрите: Настройка перенаправления привязки сборки

По умолчанию приложения используют набор сборок .NET Framework, поставляемых с версией среды выполнения, используемой для компиляции приложения. Вы можете использовать признак appliesTo на элемент в прикладном конфигурационном файле, чтобы перенаправить собрание обязательные ссылки на определенную версию собраний.NET Framework. Этот необязательный атрибут использует номер версии .NET Framework, чтобы указать, к какой версии он применяется. Если никакой признак appliesTo не определен, , элемент относится ко всем версиям.NET Framework.

-121--1614421-

Трудность устранения неполадок без рабочего примера, но можно попытаться скрыть и показать входные данные, чтобы заставить IE перерисовать элемент.

Что-то вроде:

var myIFrame = $("#iframeName");
myIFrame.focus();
myIFrame.contents().find('#inputName').hide();
var x = 1;
myIFrame.contents().find('#inputName').show().focus();

Это может привести IE к отображению курсора.

-121--4859870-

В документации Mono сообщается, что модуль имеет кучу руководств по метаданным .

Возможно, Сесил поможет вам найти тип на основе его guid? Однако не уверен, что существует класс GuidHeap , он, кажется, генерирует путеводители, но, возможно, этого достаточно для работы вашего кэша?

0
ответ дан 2 December 2019 в 20:40
поделиться

почему бы не использовать для этого обозначенное свойство, т.е. AssemblyQualifiedName ? Это свойство документируется как "может быть сохранено и позже использовано для загрузки типа".

GUID предназначен для COM-интерфейса.

7
ответ дан 2 December 2019 в 20:40
поделиться

Как насчет (из генерирующих детерминированные руководства ):

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 (). CassificqualifiedName . Вы можете сохранить эти данные внутри словаря коллекции (или, что бы ни на него ).

Таким образом, у вас всегда будет такой же GUID для данного типа (возможен предупреждение: столкновение).

1
ответ дан 2 December 2019 в 20:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: