>백엔드 개발 >C#.Net 튜토리얼 >C# 동적 객체 동적 구현 방법 및 속성 동적 코드에 대한 자세한 설명

C# 동적 객체 동적 구현 방법 및 속성 동적 코드에 대한 자세한 설명

黄舟
黄舟원래의
2017-03-21 11:54:451525검색

다음 편집기는 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.