C\#Dynamic 의:ExpandoObject,DynamicObject,DynamicMetaOb 의 응용(하)
왜 TryXXX 방법 이 호출 되 지 않 았 습 니까?
Dynamic Product 의 name 수정자 를 private 로 변경 합 니 다.
private string name;
TrySetMember 방법 에서 정지점 을 설정 하고 다시 실행 할 수 있 습 니 다.
왜 액세서리 에 접근 하 는 것 은 Public 입 니 다.TrySetMember 를 호출 하지 않 고 Private 이면 호출 됩 니까?
프 라이 빗 이 이상 을 던 져 서 그런 가?
Msdn 의 TrySetMember 방법 에 대한 설명 을 다시 한 번 살 펴 보 겠 습 니 다.
Msdn 비고
.................................................................................이러한 속성 이 없 으 면 DLR 에서 TrySetMember 방법 을 호출 합 니 다.
문제 의 원인 은 다음 과 같 습 니 다.우선 DLR 은 언어 연결 프로그램 을 사용 하여 클래스 에서 name 의 정적 정 의 를 찾 습 니 다.
name 은 Public 이기 때문에 찾 은 다음 에 되 돌아 갑 니 다.TrySetMember 방법 을 사용 하지 않 습 니 다.
그러나 name 이 private 라면 프로그램 이 클래스 에서 name 의 정적 정 의 를 찾 지 못 했 기 때문에 DLR 은 TrySetMember 방법 을 호출 하려 고 시도 합 니 다.
TrySetMember 를 수정 하 는 방법 은 다음 과 같 습 니 다.
public override bool TrySetMember(SetMemberBinder binder, object value)
{
Console.WriteLine("TrySetMember ,Name:{0}", binder.Name);
bool result = base.TrySetMember(binder, value);
return true;
}
실행 하면 이상 을 던 지지 않 습 니 다:요약:우선 DLR 은 속성의 정적 정 의 를 찾 으 려 고 시도 합 니 다.찾 지 못 하면 해당 하 는 TryXXX 방법 을 사용 합 니 다.TryXXX 방법 이 false 로 돌아 가면 TryXXX 방법 이 실 패 했 음 을 의미 합 니 다.DLR 은 나중에 이상 을 던 집 니 다.
그렇지 않 은 지 검증 하기 위해 DynamicProduct 의 속성 에 대한 정적 정 의 를 모두 설명 하고 TryXXX 방법 을 모두 True 로 되 돌려 줍 니 다.전체 코드 는 다음 과 같 습 니 다:
class DynamicProduct : DynamicObject
{
#region dynamicProduct
//private string name;
//public int Id { get; set; }
//public void ShowProduct()
//{
// Console.WriteLine("Id={0} ,Name={1}", Id, name);
//}
#endregion
#region Override DynamicObject
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
Console.WriteLine("TryGetMember ,Name:{0}", binder.Name);
bool tryResult = base.TryGetMember(binder, out result);
return true;
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
Console.WriteLine("TrySetMember ,Name:{0}", binder.Name);
bool tryResult = base.TrySetMember(binder, value);
return true;
}
public override bool TryInvoke(InvokeBinder binder, object[] args, out object result)
{
Console.WriteLine("TryInvoke ");
bool tryResult = base.TryInvoke(binder, args, out result);
return true;
}
public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
{
Console.WriteLine("TryInvokeMember ,Name:{0}", binder.Name);
bool tryResult = base.TryInvokeMember(binder, args, out result);
return true;
}
#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();
}
실행,결 과 는 다음 과 같 습 니 다:d.P3 = d.M1(d.P1, d.M2(d.P2));
왼쪽 에서 오른쪽으로,안에서 밖으로 의 원칙 에 따르다.
1:d.P1 을 먼저 호출 하면 DLR 은 d 의 GetMetaObject 방법 을 시도 합 니 다.이 방법 은 MyMetaObject 대상 을 되 돌려 줍 니 다.
이 어 DLR 은 속성 을 호출 한 다 는 것 을 알 고 되 돌아 오 는 MyMetaObject 대상 의 BindGetMember 방법 을 호출 합 니 다.
GetMember of property P1 로 출력
2:d.P2 를 호출 합 니 다.d.P1 을 호출 하 는 것 과 같 습 니 다.
3:d.M2 를 호출 하고 같은 DLR 에서 d 를 호출 하 는 GetMetaObject 방법 으로 MyMetaObject 대상 을 되 돌려 주 고 대상 을 되 돌려 주 는 BindInvokeMember 방법 을 호출 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.