扩展属性(xattrs)提供了一个机制用来将键值对(Key/Value)永久地关联到文件,让现有的文件系统得以支持在原始设计中未提供的功能。根据这个思路,用C#中拓展方法尝试
第一版,使用对象关联,这种方式有点鸡肋,没有直接继承拓展来的痛快。
using Newtonsoft.Json;
using System.Collections.Concurrent;
namespace System.Text;
/// <summary>
/// 第三方类库中的类,不能更改
/// </summary>
public class OriginalClass
{
public int Id { get; set; }
}
/// <summary>
/// 拓展类属性类
/// </summary>
public class OriginalClassExpand : IDisposable
{
public string Name { get; set; } = string.Empty;
public DateTime Birthday { get; set; }
public OriginalClassExpand()
{
ExpandDictionary.ExpandPropertysDic.TryAdd(this, new OriginalClass());
}
public void Dispose()
{
ExpandDictionary.ExpandPropertysDic.TryRemove(this, out _);
}
public override string ToString()
{
var orgJsonVal = JsonConvert.SerializeObject(this.GetExpandPropertys()).TrimEnd('}');
var curjsonVal = JsonConvert.SerializeObject(this).TrimStart('{');
return orgJsonVal + ',' + curjsonVal;
}
}
public static class ExpandDictionary
{
public static ConcurrentDictionary<OriginalClassExpand, OriginalClass> ExpandPropertysDic = new();
public static OriginalClass GetOriginalPropertys(this OriginalClassExpand originalClassExp)
{
if (ExpandPropertysDic.TryGetValue(originalClassExp, out OriginalClass? originalClass))
{
return originalClass;
}
throw new ArgumentNullException(nameof(originalClassExp));
}
}
第二版 使用改变思路使用 原类型当做Key
using System.Collections.Concurrent;
namespace System.Text;
/// <summary>
/// 第三方类库中的类,不能更改
/// </summary>
public class OriginalClass
{
public int Id { get; set; }
}
/// <summary>
/// 拓展类属性类
/// </summary>
public class OriginalClassExpand
{
public string Name { get; set; } = string.Empty;
public DateTime Birthday { get; set; }
}
public static class ExpandDictionary
{
static ConcurrentDictionary<OriginalClass, OriginalClassExpand> ExpandPropertysDic = new();
/// <summary>
/// 注意事项:获取前请检查是否调用RelevanceExpandProperty
/// 用完请调用DisposeExpandProperty
/// </summary>
/// <param name="originalClass"></param>
/// <returns></returns>
/// <exception cref="ArgumentNullException"></exception>
public static OriginalClassExpand GetExpandPropertys(this OriginalClass originalClass)
{
if (ExpandPropertysDic.TryGetValue(originalClass, out OriginalClassExpand? originalClassExp))
{
return originalClassExp;
}
throw new ArgumentNullException(nameof(originalClass));
}
public static bool RelevanceExpandProperty(this OriginalClass originalClass)
{
return ExpandPropertysDic.TryAdd(originalClass, new OriginalClassExpand());
}
public static bool DisposeExpandProperty(this OriginalClass originalClass)
{
return ExpandPropertysDic.Remove(originalClass, out _);
}
}
第三版,使用新的字典类型
using System.Collections.Concurrent;
using System.Runtime.CompilerServices;
namespace System.Text;
/// <summary>
/// 第三方类库中的类,不能更改
/// </summary>
public class OriginalClass
{
public int Id { get; set; }
}