Как я могу получить текущий тип из статического метода абстрактно class?

Как мне получить текущий Тип в статическом методе, который определен в абстрактном классе?

Обратите внимание, что, поскольку метод определен в абстрактный класс, я не могу использовать 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 ?

7
задан Alon Gubkin 19 July 2011 в 15:24
поделиться