C\#Dynamic 의:ExpandoObject,DynamicObject,DynamicMetaOb 의 응용(상)
dynamic dynEO = new ExpandoObject();
dynEO.number = 10;
dynEO.Increment = new Action(() => { dynEO.number++; });
Console.WriteLine(dynEO.number);
dynEO.Increment();
Console.WriteLine(dynEO.number);
dyneEO.number 에서 number 는 동적 으로 속성 을 추가 합 니 다.dyneO.Incrediment 에서 Incrediment 는 동적 으로 추 가 된 Action 의뢰 입 니 다.
Expando Object 의 모든 구성원:
foreach (var property in (IDictionary<String, Object>)dynEO)
{
Console.WriteLine(property.Key + ": " + property.Value);
}
결 과 는 다음 과 같다.속성 변경 알림 수신:
static void Main(string[] args)
{
………
((INotifyPropertyChanged)dynEO).PropertyChanged += new PropertyChangedEventHandler(Program_PropertyChanged);
dynEO.Name = "changed";
dynEO.Name = "another";
Console.ReadLine();
}
static void Program_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
Console.WriteLine(" {0} ", e.PropertyName);
}
결과:System.Dynamic.DynamicObject:실행 할 때의 동적 행동 을 지정 하 는 기본 클래스 를 제공 합 니 다.
새 클래스 Dynamic Product,기본적으로 Product 과 유사 합 니 다.
DynamicObject 를 이 어 받 아 TryXXX 를 잔뜩 오 버 라 이 드 할 수 있 는 방법 을 볼 수 있다.
중요 한 것 은:
SampleObject 가 dynamicObject 라 고 가정 해 보 세 요.
TryGetMember
int number=sample Object.Number 를 호출 할 때 사용 합 니 다.
TrySetMember
sample Object.Number=number 를 호출 할 때 사용 합 니 다.
TryInvoke
sample Object(100)호출 시 사용
TryInvokeMember
sample Object.someMethod(100)를 호출 할 때 사용 합 니 다.
전체 코드 는 다음 과 같 습 니 다:
class DynamicProduct : DynamicObject
{
public string name;
public int Id { get; set; }
public void ShowProduct()
{
Console.WriteLine("Id={0} ,Name={1}", Id, name);
}
#region Override DynamicObject
public override IEnumerable<string> GetDynamicMemberNames()
{
return base.GetDynamicMemberNames();
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
Console.WriteLine("TryGetMember ,Name:{0}", binder.Name);
return base.TryGetMember(binder, out result);
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
Console.WriteLine("TrySetMember ,Name:{0}", binder.Name);
return base.TrySetMember(binder, value);
}
public override bool TryInvoke(InvokeBinder binder, object[] args, out object result)
{
Console.WriteLine("TryInvoke ");
return base.TryInvoke(binder, args, out result);
}
public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
{
Console.WriteLine("TryInvokeMember ,Name:{0}", binder.Name);
return base.TryInvokeMember(binder, args, out result);
}
#endregion
}
주요 함수 코드 는 다음 과 같다.
static void Main(string[] args)
{
dynamic dynProduct = new DynamicProduct();
dynProduct.name = "n1"; // TrySetMember
dynProduct.Id = 1;
dynProduct.Id = dynProduct.Id + 3;
dynProduct.ShowProduct();
Console.ReadLine();
}
결 과 는 다음 과 같다..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; }
이론 적 으로 말 하면 수출 해 야 한다.
TrySetMember :name 필드 설정
TrySetMember :Id 속성 설정
TryGetMember :Id 속성 가 져 오기
TrySetMember :Id 속성 설정
TryInvokeMember :쇼 제품 방법 호출
Id =4 ,Name = n1
왜 TryXXX 방법 이 호출 되 지 않 았 습 니까?
다음 편 에 서 는 이 문 제 를 설명 할 것 이 니 지속 적 으로 관심 을 가 져 주세요.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C\#Dynamic 의:ExpandoObject,DynamicObject,DynamicMetaOb 의 응용(하)그러나 name 이 private 라면 프로그램 이 클래스 에서 name 의 정적 정 의 를 찾 지 못 했 기 때문에 DLR 은 TrySetMember 방법 을 호출 하려 고 시도 합 니 다. 요약:우선 DLR 은 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.