代码改变世界

Caliburn笔记-元数据(Metadata)管理(wpf框架)

2009-12-25 10:45  Clingingboy  阅读(1216)  评论(0编辑  收藏  举报

   在.net中允许我们使用元数据(即Attribute),在使用Action时,结合元数据可以为框架功能提供一些便利.

caliburn提供了很多的元数据,其皆继承自IMetadata接口,该接口即一个空元数据标记接口而已,继承此接口的元数据则表明为属于caliburn功能范围内的元数据,方便管理.

image

IMetadataContainer接口提供了对IMetadata的管理

image

MetadataContainer为IMetadataContainer默认实现,继承MetadataContainer的类则均具有管理元数据的功能

image

/// <summary>
/// An implementation of <see cref="IMetadataContainer"/>.
/// </summary>
public class MetadataContainer : PropertyChangedBase, IMetadataContainer
{
    private List<IMetadata> _metadata;

    /// <summary>
    /// Adds the metadata from the provided member to the collection.
    /// </summary>
    /// <param name="member">The member.</param>
    protected virtual void AddMetadataFrom(MemberInfo member)
    {
        member.GetCustomAttributes(true)
            .OfType<IMetadata>()
            .Apply(AddMetadata);
    }

    /// <summary>
    /// Adds metadata to the store.
    /// </summary>
    /// <param name="metadata">The metadata.</param>
    public virtual void AddMetadata(IMetadata metadata)
    {
        if(_metadata == null)
            _metadata = new List<IMetadata>();

        _metadata.Add(metadata);
    }

    /// <summary>
    /// Retrieves metadata from the store.
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <returns></returns>
    public virtual T GetMetadata<T>()
        where T : IMetadata
    {
        return _metadata == null
                   ? default(T)
                   : _metadata.OfType<T>().FirstOrDefault();
    }

    /// <summary>
    /// Gets the matching metadata.
    /// </summary>
    /// <typeparam name="T">The type to match.</typeparam>
    /// <returns>The matches</returns>
    public virtual IEnumerable<T> GetMatchingMetadata<T>()
        where T : IMetadata
    {
        return _metadata == null
                   ? new List<T>()
                   : _metadata.OfType<T>();
    }
}