확장 속성을 사용하여 대상에 동적 추가 데이터를 가져오기 (계속)
12942 단어 대상
다음은 확장 속성의 동태성에 관한 문제를 계속 소개하겠습니다.
지난 글에서 확장 속성의 동적 인터페이스를 어떻게 사용했는지 기억나십니까?
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] 많은 소통 부탁드립니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
List 컬렉션 객체에서 서로 다른 속성 크기로 정렬된 인스턴스인스턴스는 다음과 같습니다. 테스트: 출력 결과는 다음과 같습니다. 두 번째 방법은 컬렉션에 따라.sort 재부팅 방법(예: 마스터 클래스에서 이렇게 작성하면 됩니다. 출력 결과는 다음과 같습니다. 전자의 코드 구조...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.