По различным причинам я должен реализовать механизм кэширования типа в C#. К счастью, CLR обеспечивает Type.GUID
однозначно определять тип. К сожалению, я не могу найти способ искать тип на основе этого GUID. Существует Type.GetTypeFromCLSID()
но на основе моего понимания документации (и эксперименты), который делает что-то очень, очень отличающийся.
Там какой-либо путь состоит в том, чтобы получить тип на основе своего GUID за исключением цикличного выполнения через все загруженные типы и по сравнению с их GUID?
Править: Я забыл упоминать, что я действительно хотел бы "цифровой отпечаток типа" фиксированной ширины, вот почему GUID так обращается ко мне. В общем случае, конечно, работало бы полностью определенное название типа.
Не зацикливайся на сравнении. Заполните Словарь
и используйте метод Contains
.
Dictionary<Type> types = new Dictionary<Types>();
... //populate
if (types.Contains(someObject.GetType()))
//do something
Это, безусловно, даст вам запись фиксированного размера, так как все они будут ссылками на объекты (экземпляры Type, по сути, являются объектами фабрики).
Если вы контролируете эти классы, я бы порекомендовал:
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.
Посмотрите: Настройка перенаправления привязки сборки
-121--1614421-По умолчанию приложения используют набор сборок .NET Framework, поставляемых с версией среды выполнения, используемой для компиляции приложения. Вы можете использовать признак appliesTo на
элемент
в прикладном конфигурационном файле, чтобы перенаправить собрание обязательные ссылки на определенную версию собраний.NET Framework. Этот необязательный атрибут использует номер версии .NET Framework, чтобы указать, к какой версии он применяется. Если никакой признак appliesTo не определен,, элемент
относится ко всем версиям.NET Framework.
Трудность устранения неполадок без рабочего примера, но можно попытаться скрыть и показать входные данные, чтобы заставить 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 , он, кажется, генерирует путеводители, но, возможно, этого достаточно для работы вашего кэша?
почему бы не использовать для этого обозначенное свойство, т.е. AssemblyQualifiedName ? Это свойство документируется как "может быть сохранено и позже использовано для загрузки типа".
GUID предназначен для COM-интерфейса.
Как насчет (из генерирующих детерминированные руководства ):
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
для данного типа (возможен предупреждение: столкновение).