2

我有一个对象交给我们的图书馆并通过了各种流程。当这些对象通过各个阶段并从另一端出来时,我需要为它们附加一些额外的信息——我猜这是一种动态装饰器模式,除了添加额外的属性而不是改变现有的行为。

我希望使用 LinFu 或 Castle 来创建动态代理并在对象上实现一个附加接口来存储它。知道扩展接口的组件可以转换和访问它 - 而那些不被遗忘的组件,因为底层类型没有改变。

但是,我没有意识到所有这些机制都假设您可以控制最初创建类型的点 - 我没有。

有人对我如何更好地解决这个问题有建议吗?

非常感谢

4

3 回答 3

0

这并不能完全解决您的场景,但是使用 DynamicObject 实现作为对象周围的装饰器怎么样?它将允许您访问原始对象以及其他属性。有点像 ExpandoObject 但从您自己的实例数据开始。

像这样的东西:

public class Expando : DynamicObject
{
    public dynamic Instance;
    Dictionary<string, dynamic> ExtraProperties = new Dictionary<string, dynamic>();

    public Expando(object instance)
    {
        Instance = instance;
    }

    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        try
        {
            result = ReflectionUtils.GetProperty(Instance, binder.Name);
            return true;
        }
        catch
        {
            if (ExtraProperties.Keys.Contains(binder.Name))
            {
                result = ExtraProperties[binder.Name];
                return true;
            }
        }

        result = null;
        return false;
    }

    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        try
        {
            ReflectionUtils.SetProperty(Instance, binder.Name, value);
        }
        catch (Exception ex)
        {
            ExtraProperties[binder.Name] = value;
        }

        return true;
    }

    public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
    {
        try
        {
            result = ReflectionUtils.CallMethod(Instance, binder.Name, args);
            return true;
        }
        catch
        {}

        result = null;
        return false;
    }
}

不幸的是,它并没有解决您的强类型/界面要求,并且考虑到此处的反射使用(来自https://github.com/RickStrahl/Westwind.Utilities/blob/master/Westwind.实用程序/实用程序/ReflectionUtils.cs

于 2011-11-16T21:32:02.433 回答
0

似乎有点矫枉过正......只需创建一个只包含“额外”属性的新类。定义一个静态的Dictionary<MainClass,ExtensionsClass>。当您的“知情”组件想要查看对象的扩展属性时,它们只需在字典中查找该对象。

于 2011-11-16T21:38:26.900 回答
0

您想使用此处的方法在 c# 中在运行时将扩展属性添加到类型化对象

这样你就不会出现内存泄漏

于 2012-06-06T11:08:18.453 回答