如何为不可编辑的Metadata类添加属性?求可行解决方案
无法编辑Metadata类时添加新属性的解决办法
以下是几种无需修改原类源码就能扩展属性的可行方案:
1. 子类继承扩展
如果原Metadata类不是密封类,直接继承它并新增属性:
public class ExtendedMetadata : Metadata { public string CustomProperty { get; set; } }
之后用ExtendedMetadata替代原类实例即可,适用于允许替换类型的场景。
2. 组合包装类
若原类是密封类无法继承,创建包装类包裹原实例,同时添加新属性:
public class MetadataWrapper { public Metadata Original { get; } public string CustomProperty { get; set; } public MetadataWrapper(Metadata original) { Original = original; } }
通过包装类既能访问原类的所有成员,又能使用新增属性。
3. 字典存储额外属性
用字典以原实例为键,存储额外属性值,无需修改或包装原类:
// 建议使用弱引用字典避免内存泄漏 private static readonly WeakReferenceDictionary<Metadata, string> _extraProps = new(); // 设置属性 _extraProps.Add(metadataInstance, "自定义值"); // 获取属性 if (_extraProps.TryGetValue(metadataInstance, out var value)) { // 使用获取到的value }
注意要处理好实例引用的唯一性,推荐用弱引用字典防止内存泄漏。
4. 扩展方法模拟属性
结合扩展方法和字典,模拟属性的调用方式:
public static class MetadataExtensions { private static readonly Dictionary<Metadata, string> _customPropStore = new(); public static void SetCustomProperty(this Metadata metadata, string value) { _customPropStore[metadata] = value; } public static string GetCustomProperty(this Metadata metadata) { _customPropStore.TryGetValue(metadata, out var value); return value; } }
使用时直接通过实例调用:
metadataInstance.SetCustomProperty("测试值"); var propValue = metadataInstance.GetCustomProperty();
内容的提问来源于stack exchange,提问作者Abdalla Ahmed
相关产品推荐
相关产品推荐

