확장 속성을 사용하여 대상에 동적 추가 데이터를 가져오기 (계속)

12942 단어 대상
이전 글에서 우리는 확장 속성의 원리와 구조를 이해했다. 사실 그 내부 구조와 사상은 모두 WPF의 의존 속성과 기본적으로 같다. 여러분도 그 중에서 의존 속성에 대한 원리를 이해할 수 있다. 이것은 의존 속성을 이해하고 사용하는 데 큰 도움이 된다.'확장 속성'은 특정한 장면에 대한 일부 확장(예를 들어 일반 유형 대상의 확장 속성 정의를 지원한다).그러나 그 원리상 속성은 모두 외부에 보존되어 있기 때문에 한 가지 문제는 대상의 속성을 제때에 회수하여 방출하지 못하고 수동으로 방출해야 한다는 것이다(여기에 좋은 해결 방법이 있는지 모르겠다).
다음은 확장 속성의 동태성에 관한 문제를 계속 소개하겠습니다.
지난 글에서 확장 속성의 동적 인터페이스를 어떻게 사용했는지 기억나십니까?
   1:  var user1 = new UserInfo1() { Age = 21, Name = "maxzhang1" };
   2:  dynamic dyuser = user1.ToDynamicAttachObject();
   3:  rrr=  dyuser.Info;
   4:  dyuser.Info = 1;
   5:  int d = dyuser.Info;

<!--
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
-->
dynamic 유형에 대해 두 편의 글1을 추천합니다2.다음은 확장 속성에서 동적 특성을 어떻게 정의하는지 살펴보겠습니다.
   1: public class ExtendDynamicObject : DynamicObject
   2: {
   3:     private ExtendObject extendObject;
   4:  
   5:     public ExtendDynamicObject(ExtendObject exObject)
   6:     {
   7:         extendObject = exObject;
   8:     }
   9:  
  10:     public override bool TrySetMember(SetMemberBinder binder, object value)
  11:     {
  12:         string propertyName = binder.Name;
  13:  
  14:         if (this.extendObject.IsExtendProperty(propertyName))
  15:             this.extendObject.SetValue(binder.Name, value);
  16:         else
  17:         {
  18:             object owner = this.extendObject.GetOwner();
  19:             Type ownerType = owner.GetType();
  20:             var propertyInfo = ownerType.GetProperty(propertyName);
  21:             propertyInfo.SetValue(owner, value, null);
  22:         }
  23:         return true;
  24:     }
  25:  
  26:     public override bool TryGetMember(GetMemberBinder binder, out object result)
  27:     {
  28:         result = null;
  29:  
  30:         string propertyName = binder.Name;
  31:  
  32:         if (this.extendObject.IsExtendProperty(propertyName))
  33:             result = this.extendObject.GetValue(binder.Name);
  34:         else
  35:         {
  36:             object owner = this.extendObject.GetOwner();
  37:             Type ownerType = owner.GetType();
  38:             var propertyInfo = ownerType.GetProperty(propertyName);
  39:             propertyInfo.GetValue(owner, null);
  40:         }
  41:         return true;
  42:     }
  43:  
  44: }

사실은 ExtendObject 유형의 대상을 주입한 다음에 동적 으로 속성 이름과 확장 속성을 연결시킨다. 일반적인 속성에 대해 우리는 확장 대상의 GetOwner 방법을 통해 확장 대상 내부의 대상 실례를 얻을 수 있다. 여기서 확장 대상이라면 확장 대상이다. 즉, ExtendObject의 GetOwner 방법을 계승하여 얻은 것은 바로 ExtendObject 유형의 대상이다.그러나 AttachObject 형식 (이 유형을 기억하지? ExtendObject에서 계승한 것) 의 대상이라면 GetOwner 방법은 모든 대상 (object) 을 얻을 수 있으며, 대상의 실례를 통해 확장 속성의 값을 얻을 수 있으며, 일반 속성에 대해서는 반사적인 방식으로 접근할 수 있다.
위의 동적 인터페이스userInfo1 형식은 일반적인 형식입니다. 다른 형식은 계승되지 않았고user1의 Info 속성은 확장된 속성입니다. 만약에 Info 속성이 이전에 ExtendProperty를 통과하지 않았다면.RegisterProperty 메서드가 등록되어 있으면 기본적으로 Object용 Type 확장 속성이 생성됩니다.그러나 시스템에 확장 속성을 등록하면 좋은 점이 있다. 예를 들어 확장 속성에 기본값을 추가하고 이벤트를 검증하며 속성 값을 바꾸는 등이다.
   1:  private static ExtendProperty InfoProperty = 
   2:              ExtendProperty.RegisterProperty("Info", typeof(string), typeof(UserInfo),"you win");

3: InfoProperty.ValueChanging += new EventHandler<ExtendPropertyValueChangingArgs>

(InfoProperty_ValueChanging);

   4:  InfoProperty.ValueChanged += new EventHandler<ExtendPropertyValueChangedArgs>
                                              (InfoProperty_ValueChanged);

<!--
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
-->
 
다음은 재미있는 것, 속성 계승:
속성 상속은 무엇입니까? 쉽게 말하면 유형 A의 어떤 속성입니다. 유형 B에도 같은 이름의 속성이 있고 B의 속성은 A의 속성의 일부 특성을 가지고 있어야 합니다.속성 상속을 어떻게 실현하는지 살펴보자.
   1:  private static ExtendProperty InfoProperty = 
   2:              ExtendProperty.RegisterProperty("Info", typeof(string), typeof(UserInfo),"you win");
   3:  InfoProperty.AddOwner(typeof(UserInfo1), "ha ha");

<!--
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
-->
여기서 UserInfo1 유형에는 Info 속성이 하나 더 있고 UserInfo 유형의 Info 속성이 상속됩니다.이 성명의 결과는 이 두 종류 모두 각기 다른 기본값이 있지만 현재 두 가지 이벤트(검증 이벤트, 속성 값 변경 이벤트)를 공유하고 있다. 만약에 AddOwner 방법에서 유형 UserInfo1에 기본값을 추가하지 않았다면 UserInfo1의 이미지 실례에서 처음으로 인포라는 확장 속성을 방문했을 때'youwin'이라는 문자열을 얻었을 것이다. 이것은 유형 UserInfo의 속성을 계승한 것이다.앞에서 말한 AddOwner 방법으로 기본값을 추가하는 것은 유형 UserInfo의 Info를 다시 쓰는 것과 같다.
이 목적을 달성하기 위해서는 새 속성 (AddOwner 방법) 을 등록할 때 UserInfo1의 유형 + 계승할 속성 이름으로 새 키를 생성하고 기존의 확장 속성을 가리킨다. (본질은 두 대상이 하나의 속성을 공유하는 것이다.)
 
사실 이 개념은 WPF의 부가 속성과 이곡이 함께 있다.
 
제 글이 여러분의 사고방식을 넓히고 속성과 부가속성에 의존하는 원리를 이해할 수 있기를 바랍니다. 감사합니다.
[email protected] 많은 소통 부탁드립니다.

좋은 웹페이지 즐겨찾기