17

我有一个抽象基类,我想在其中实现一个检索继承类的属性的方法。像这样的东西...

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)才能访问继承类?或者这不是好的做法,我应该完全在继承类中实现该方法吗?

4

2 回答 2

20

你应该使用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;
    }
}

(如果您愿意,也可以将其实现为扩展方法)

于 2013-04-28T15:01:27.737 回答
6

typeof(this)不会编译。

您要搜索的是this.GetType().

于 2013-04-28T15:01:47.717 回答