【问题标题】:How to implement automatic properties in VS 2005 for a delegate callback如何在 VS 2005 中为委托回调实现自动属性
【发布时间】:2010-12-22 12:16:40
【问题描述】:

我正在尝试编译我在此处 (C# TWAIN interaction) 找到的 TwainDotNet 解决方案,但我束手无策。

这个解决方案显然是在 VS 2008 中开发的,我在 2005 年工作(目前没有选择)。 2005 年我可能花了很多时间来编译这一切,并且我已经将我的错误减少到两个,两个错误都是同一个问题。

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

namespace TwainDotNet.WinFroms
{
  /// <summary>
  /// A windows message hook for WinForms applications.
  /// </summary>
  public class WinFormsWindowMessageHook : IWindowsMessageHook, IMessageFilter
  {
    IntPtr _windowHandle;
    bool _usingFilter;

    public WinFormsWindowMessageHook(Form window)
    {
      _windowHandle = window.Handle;
    }

    public bool PreFilterMessage(ref Message m)
    {
      if (FilterMessageCallback != null)
      {
        bool handled = false;
        FilterMessageCallback(m.HWnd, m.Msg, m.WParam, m.LParam, ref handled);
        return handled;
      }

      return false;
    }

    public IntPtr WindowHandle { get { return _windowHandle; } }

    public bool UseFilter
    {
      get
      {
        return _usingFilter;
      }

      set
      {
        if (!_usingFilter && value == true)
        {
          Application.AddMessageFilter(this);
          _usingFilter = true;
        }

        if (_usingFilter && value == false)
        {
          Application.RemoveMessageFilter(this);
          _usingFilter = false;
        }
      }
    }

    public FilterMessage FilterMessageCallback 
    {
      get; 
      set;
    }
  }

}

在访问委托实例的属性上编译失败。

错误:“TwainDotNet.WinFroms.WinFormsWindowMessageHook.FilterMessageCallback.get”必须声明一个主体,因为它没有标记为抽象或外部

这是该类实现的接口IWindowsMessageHook:

using System;
using System.Collections.Generic;
using System.Text;

namespace TwainDotNet
{
  public interface IWindowsMessageHook
  {
    /// <summary>
    /// Gets or sets if the message filter is in use.
    /// </summary>
    bool UseFilter { get; set; }

    /// <summary>
    /// The delegate to call back when the filter is in place and a message arrives.
    /// </summary>
    FilterMessage FilterMessageCallback { get; set; }

    /// <summary>
    /// The handle to the window that is performing the scanning.
    /// </summary>
    IntPtr WindowHandle { get; }
  }

  public delegate IntPtr FilterMessage(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled);
}

我承认自己是代理新手,我在这里不知所措。如何在 VS 2005 中复制此功能?

感谢您的时间。

【问题讨论】:

    标签: c# visual-studio-2005 delegates callback twain


    【解决方案1】:

    只需使用支持字段:

    private FilterMessage m_FilterMessageCallback;
    public FilterMessage FilterMessageCallback 
    {
      get { return m_FilterMessageCallback; }
      set { m_FilterMessageCallback = value; }
    }
    

    界面中的代码

    FilterMessage FilterMessageCallback { get; set; }
    

    顺便说一句。与C#2.0/3.0无关,这是一个带有setter和getter的普通接口定义。

    【讨论】:

    • 非常感谢大家。我只是不知道 VS 2008 编译器在幕后可能会做什么——我假设它做了这个事情的一个版本?
    • 是的,完全一样。
    【解决方案2】:

    一个事件可能是可取的,但作为一个委托属性:

    private FilterMessage filterMessageCallback;
    public FilterMessage FilterMessageCallback 
    {
      get {return filterMessageCallback;}
      set { filterMessageCallback = value;}
    }
    

    为避免边缘情况(线程竞争/null),您可能还需要:

    public bool PreFilterMessage(ref Message m)
    {
      FilterMessage callback = FilterMessageCallback;
      if (callback != null)
      {
        bool handled = false;
        callback(m.HWnd, m.Msg, m.WParam, m.LParam, ref handled);
        return handled;
      }
    
      return false;
    }
    

    【讨论】:

      【解决方案3】:

      填写属性声明中的空白——没有什么神奇的事情发生:

      private FilterMessage _filterMessageCallback;
      
      public FilterMessage FilterMessageCallback
      {
          get { return _filterMessageCallback; }
          set { _filterMessageCallback = value; }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-17
        • 2018-06-11
        • 2020-10-09
        • 1970-01-01
        • 1970-01-01
        • 2019-10-07
        • 2013-03-08
        • 1970-01-01
        相关资源
        最近更新 更多