代码改变世界

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

  Clingingboy  阅读(1218)  评论(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>();
    }
}
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示