c# - 在 C# 中的运行时向类型化对象添加 expando 属性

标签 c# garbage-collection expandoobject

在 .net 中是否有任何方法可以在运行时将属性字典绑定(bind)到实例,即,就好像基本对象类具有如下属性:

public IDictionary Items { get; }

我想出了一个涉及静态字典和扩展方法的解决方案

void Main()
{
    var x = new object();
    x.Props().y = "hello";
}

static class ExpandoExtension {
    static IDictionary<object, dynamic> props = new Dictionary<object, dynamic>();
    public static dynamic Props(this object key)
    { 
        dynamic o;
        if (!props.TryGetValue(key, out o)){
            o = new ExpandoObject();
            props[key] = o;
        }
        return o;       
    } 
}

但这会阻止对象获得 GC,因为 props 集合包含一个引用。事实上,这对于我的特定用例来说还可以,因为一旦我完成了我正在使用它们的特定事情,我就可以手动清除 Prop ,但我想知道,是否有一些巧妙的方法来绑定(bind)ExpandoObject 到键,同时允许垃圾收集?

最佳答案

看看 ConditionalWeakTable<TKey, TValue> Class .

The ConditionalWeakTable<TKey, TValue> class enables language compilers to attach arbitrary properties to managed objects at run time. A ConditionalWeakTable<TKey, TValue> object is a dictionary that binds a managed object, which is represented by a key, to its attached property, which is represented by a value. The object's keys are the individual instances of the TKey class to which the property is attached, and its values are the property values that are assigned to the corresponding objects.

本质上,它是一个字典,其中的键和值都是弱引用的,只要键还活着,值就会保持事件状态。


static class ExpandoExtensions
{
    private static readonly ConditionalWeakTable<object, ExpandoObject> props =
        new ConditionalWeakTable<object, ExpandoObject>();

    public static dynamic Props(this object key)
    { 
        return props.GetOrCreateValue(key);       
    } 
}

关于c# - 在 C# 中的运行时向类型化对象添加 expando 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5204382/

相关文章:

c# - 将与字符串同名的属性添加到 ExpandoObject

c# - 我何时/为何应使用后期绑定(bind)? (动态对象和 ExpandoObject)

c# - "The creator of this fault did not specify a Reason"异常

c# - 绑定(bind)到 XAML 中的 Xamarin Picker SelectedItem 而不是重新加载表单

c# - 静态一次性元素

java - 哪个循环的性能更好?为什么?

java - java应用程序的系统内存使用量与堆使用量相比巨大

c# - 在 XML 日期时间上正确设置日期时间格式

c#代码转成QT C++

c# - 动态对象的特殊字符?