2011-11-11 42 views
2

我有一个对象递交到我们的库中,并通过各种进程。我需要附加一些额外的信息给这些对象,因为它们通过各个阶段和另一端 - 一种动态装饰模式,我猜,除了添加额外的属性,而不是改变现有的行为。对现有对象实例的鸭子输入/动态代理

我曾经希望使用LinFu或Castle创建一个动态代理并在对象上实现一个额外的接口来存储这个接口。知道扩展接口的组件可以投射和访问它 - 而那些不是不知情的,因为基础类型没有改变。

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

有没有人有关于我如何才能更好地处理这个问题的建议?

非常感谢

回答

-1

这并不完全解决您的方案,但如何使用,充当你的周围物体装饰一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; 
    } 
} 

它不涉及您的强类型/接口要求但不幸的是,性能是不是将要在这里得到最大程度的反射使用(从http://www.west-wind.com:8080/svn/WestwindWebToolkit/trunk/Westwind.Utilities/Utilities/ReflectionUtils.cs

0

看起来像过度杀伤......只是创建一个只包含“额外”属性的新类。定义一个静态的Dictionary<MainClass,ExtensionsClass>。当你的组件“知道”想要查看对象的扩展属性时,他们只需在字典中查看该对象即可。