Подтвердить что ты не робот

Как получить "Тип" подкласса из базового класса

У меня есть абстрактный базовый класс, в котором я хотел бы реализовать метод, который будет извлекать свойство атрибута наследующего класса. Что-то вроде этого...

public abstract class MongoEntityBase : IMongoEntity {

    public virtual object GetAttributeValue<T>(string propertyName) where T : Attribute {
        var attribute = (T)typeof(this).GetCustomAttribute(typeof(T));
        return attribute != null ? attribute.GetType().GetProperty(propertyName).GetValue(attribute, null) : null;
    }
}

И реализовано так...

[MongoDatabaseName("robotdog")]
[MongoCollectionName("users")]
public class User : MonogoEntityBase {
    public ObjectId Id { get; set; }

    [Required]
    [DataType(DataType.EmailAddress)]
    public string email { get; set; }

    [Required]
    [DataType(DataType.Password)]
    public string password { get; set; }

    public IEnumerable<Movie> movies { get; set; }
}

Но, конечно, с приведенным выше кодом GetCustomAttribute() не является доступным методом, потому что это не конкретный класс.

Что требуется typeof(this) в абстрактном классе для доступа к наследующему классу? Или это не очень хорошая практика, и должен ли я реализовать метод в наследующем классе вообще?

4b9b3361

Ответ 1

Вы должны использовать this.GetType(). Это предоставит вам конкретный конкретный тип экземпляра.

Итак, в этом случае:

public virtual object GetAttributeValue<T>(string propertyName) where T : Attribute {
    var attribute = this.GetType().GetCustomAttribute(typeof(T));
    return attribute != null ? attribute.GetType().GetProperty(propertyName).GetValue(attribute, null) : null;
}

Обратите внимание, что он вернет самый верхний класс. То есть, если бы у вас было:

public class AdministrativeUser : User
{

}

public class User : MongoEntityBase
{

}

Затем this.GetType() вернет AdministrativeUser.


Кроме того, это означает, что вы можете реализовать метод GetAttributeValue вне базового класса abstract. Вы не должны требовать, чтобы исполнители наследовали от MongoEntityBase.

public static class MongoEntityHelper
{
    public static object GetAttributeValue<T>(IMongoEntity entity, string propertyName) where T : Attribute 
    {
        var attribute = (T)entity.GetType().GetCustomAttribute(typeof(T));
        return attribute != null ? attribute.GetType().GetProperty(propertyName).GetValue(attribute, null) : null;
    }
}

(может также реализовать его как метод расширения, если вы хотите)

Ответ 2

typeof(this) не будет компилироваться.

То, что вы ищете, это this.GetType().