다음 편집기는 C# 동적 개체(메서드 및 속성의 동적 구현)에 대한 자세한 설명을 제공합니다. 편집자님이 꽤 좋다고 생각하셔서 지금 공유하고 모두에게 참고용으로 드리고자 합니다. 에디터를 따라가서 살펴보겠습니다.
C#에서 동적 개체의 속성 구현은 비교적 간단합니다. 동적 언어와 같은 동적 메서드를 구현하려면 동적 개체, 확장 메서드, 익명 메서드는 직접 메서드를 사용할 수 없습니다. 여기서는 여전히 개체와 대리자를 사용하여 이 동적 메서드의 구현을 시뮬레이션합니다.
1) 대리자를 정의합니다. 매개변수 수는 가변적이며 매개변수는 모두 개체 유형입니다. 여기 있는 대부분의 대리자에는 이 대리자를 호출하는 동적 개체 자체를 나타내는 동적 매개변수가 있습니다.
public delegate object MyDelegate(dynamic Sender, params object[] PMs);
2) 동적 객체는 익명 메소드를 직접 사용할 수 없기 때문에 위임된 전송 객체를 정의합니다. 여기서는 이를 전달하기 위해 객체를 사용합니다.
public class DelegateObj { private MyDelegate _delegate; public MyDelegate CallMethod { get { return _delegate; } } private DelegateObj(MyDelegate D) { _delegate = D; } /// <summary> /// 构造委托对象,让它看起来有点javascript定义的味道. /// </summary> /// <param name="D"></param> /// <returns></returns> public static DelegateObj Function(MyDelegate D) { return new DelegateObj(D); } }
3) 동적 개체 정의:
public class DynObj : DynamicObject { //保存对象动态定义的属性值 private Dictionary<string, object> _values; public DynObj() { _values = new Dictionary<string, object>(); } /// <summary> /// 获取属性值 /// </summary> /// <param name="propertyName"></param> /// <returns></returns> public object GetPropertyValue(string propertyName) { if (_values.ContainsKey(propertyName) == true) { return _values[propertyName]; } return null; } /// <summary> /// 设置属性值 /// </summary> /// <param name="propertyName"></param> /// <param name="value"></param> public void SetPropertyValue(string propertyName,object value) { if (_values.ContainsKey(propertyName) == true) { _values[propertyName] = value; } else { _values.Add(propertyName, value); } } /// <summary> /// 实现动态对象属性成员访问的方法,得到返回指定属性的值 /// </summary> /// <param name="binder"></param> /// <param name="result"></param> /// <returns></returns> public override bool TryGetMember(GetMemberBinder binder, out object result) { result = GetPropertyValue(binder.Name); return result == null ? false : true; } /// <summary> /// 实现动态对象属性值设置的方法。 /// </summary> /// <param name="binder"></param> /// <param name="value"></param> /// <returns></returns> public override bool TrySetMember(SetMemberBinder binder, object value) { SetPropertyValue(binder.Name, value); return true; } /// <summary> /// 动态对象动态方法调用时执行的实际代码 /// </summary> /// <param name="binder"></param> /// <param name="args"></param> /// <param name="result"></param> /// <returns></returns> public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) { var theDelegateObj = GetPropertyValue(binder.Name) as DelegateObj; if (theDelegateObj == null || theDelegateObj.CallMethod == null) { result = null; return false; } result = theDelegateObj.CallMethod(this,args); return true; } public override bool TryInvoke(InvokeBinder binder, object[] args, out object result) { return base.TryInvoke(binder, args, out result); } }
테스트 코드 적용:
dynamic theObj = new DynObj(); theObj.aaa = "this is a test";//动态属性 //动态方法,这里不能没法定义参数,调用的时候可以是任意多参数,具体参数类型和含义就只能自己去小心处理了. theObj.show = DelegateObj.Function((s, pms) => { if (pms != null && pms.Length > 0) { MessageBox.Show(pms[0].ToString() + ":" + s.aaa); } else { MessageBox.Show(s.aaa); } return null; } ); theObj.show("hello");
보면서 약간 JS가 객체 메소드를 정의하는 것처럼 들리는데 C#은 정적 언어이기 때문에 제공되는 동적 시뮬레이션 메커니즘은 여전히 제한적입니다. 그러나 모든 값 저장 및 메소드는 직접 작성하여 처리해야 합니다. code.
위 코드는 vs2010, Windows 2008 Server, Framework 4.0에서 정상적으로 테스트되었습니다.
위 내용은 C# 동적 객체 동적 구현 방법 및 속성 동적 코드에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!