Как я могу получить текущий Type
в статическом методе, который определен в абстрактном классе?
Обратите внимание, что, поскольку метод определен в абстрактном классе, я не могу использовать 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);
EDIT:
Вот сценарий.
Сущность представляет собой трехмерный объект.Я пишу серверное программное обеспечение, у которого есть список таких объектов.Сервер вручную сериализует список и отправляет его клиенту.Поскольку производительность здесь очень важна, я не посылаю имя типа.Каждый тип объекта имеет уникальный идентификатор, поэтому, когда клиент получает данные, он может эффективно десериализовать их.
Чтобы создать экземпляр объекта, я делаю что-то вроде:
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<T>
имеет параметр, который представляет идентификатор.
Но как мне написать Add<T>
метод, который не имеет параметров - который распознает идентификатор автоматически?
Итак, я думал о добавлении атрибута к вложенному Entity
:
[Identifier(1000)]
public class Rock : Entity { }
и статического свойства, которое возвращает значение атрибута Identifier
.
Тогда метод Add<T>
без параметров будет выглядеть примерно так:
public void Add<T>(ushort id)
where T : Entity, new()
{
_repo.Add(T.Identifier, new Func<Entity>(() =>
{
return new T();
}));
}
Обратите внимание, что в этом случае я мог бы просто сделать T.GetType()
, чтобы получить атрибут, но это не главное.Как я могу сделать это в статическом свойстве Entity.Identifier
?