2011-11-11 2 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>을 정의하십시오. "알고있는"구성 요소가 객체의 확장 속성을보고 싶을 때 사전에서 해당 객체를 찾습니다.

관련 문제