Как мне получить текущий Тип
в статическом методе, который определен в абстрактном классе?
Обратите внимание, что, поскольку метод определен в абстрактный класс, я не могу использовать typeof
.
Зачем мне это делать? Возможное использование - атрибуты. Рассмотрим следующий пример:
[Identifier(1000)]
public class Rock : Entity { }
public abstract class Entity
{
public static ushort Identifier
{
get
{
// How do I get here the current type of the object?
Type currentType = ...;
// in a non-static method or property, I'd do:
// Type currentType = this.GetType();
foreach (IdentifierAttribute attribute in currentType.GetCustomAttributes(true))
return attribute.Identifier;
throw new EntityException("No identifier has specified for this type of entity.");
}
}
}
Rock rock = new Rock();
// should print 1000
Console.WriteLine(rock.Identifier);
РЕДАКТИРОВАТЬ:
Вот сценарий.
Сущность представляет собой трехмерный объект. Я пишу серверное программное обеспечение, в котором есть список таких сущностей. Сервер вручную сериализует список и отправляет его клиенту. Поскольку производительность здесь очень важна, я не отправляю имя типа. Каждый тип объекта имеет уникальный идентификатор, поэтому, когда клиент получает данные, он может их эффективно десериализовать.
Чтобы создать экземпляр объекта, я делаю что-то вроде:
Entity entity = EntityRepository.Instance.CreateNew(identifier);
EntityRepository
выглядит следующим образом:
public sealed class EntityRepository
{
private static readonly Lazy<EntityRepository> lazy =
new Lazy<EntityRepository>(() => new EntityRepository());
IDictionary<ushort, Func<Entity>> _repo;
private EntityRepository()
{
_repo = new Dictionary<ushort, Func<Entity>>();
}
public static EntityRepository Instance
{
get { return lazy.Value; }
}
public Entity CreateNew(ushort id)
{
return _repo[id]();
}
public void Add<T>(ushort id)
where T : Entity, new()
{
_repo.Add(id, new Func<Entity>(() =>
{
return new T();
}));
}
}
Текущий метод Add
имеет параметр, представляющий идентификатор.
Но как мне написать метод Add
без параметров, который автоматически распознает идентификатор?
Итак, я думал о добавлении атрибута к вложенной Entity
:
[Identifier(1000)]
public class Rock : Entity { }
и статического свойства, которое возвращает значение атрибута Identifier
.
Затем, Добавить метод
без параметров будет примерно так:
public void Add<T>(ushort id)
where T : Entity, new()
{
_repo.Add(T.Identifier, new Func<Entity>(() =>
{
return new T();
}));
}
Обратите внимание, что в этом случае я мог бы просто выполнить T.GetType ()
, чтобы получить атрибут, но это не так. смысл. Как это сделать в статическом свойстве Entity.Identifier
?