C# 如何在VS2005中为委托回调实现自动属性

C# 如何在VS2005中为委托回调实现自动属性,c#,visual-studio-2005,delegates,callback,twain,C#,Visual Studio 2005,Delegates,Callback,Twain,我正试图得到我在这里找到的TwainDotNet解决方案来编译,我已经束手无策了 这个解决方案显然是在VS2008中开发的,我在2005年工作,目前没有选择。我在2005年花了很多时间来编译这一切,我把我的错误减少到了两个,两个错误都是同一个问题 using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; namespace TwainDotNet.WinFroms

我正试图得到我在这里找到的TwainDotNet解决方案来编译,我已经束手无策了

这个解决方案显然是在VS2008中开发的,我在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中复制此功能


感谢您的时间。

可能需要一个事件,但作为代理属性:

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;
}

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

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;
}

填写属性声明中的空格-没有任何神奇的事情发生:

private FilterMessage _filterMessageCallback;

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

填写属性声明中的空格-没有任何神奇的事情发生:

private FilterMessage _filterMessageCallback;

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

只需使用支持字段:

private FilterMessage m_FilterMessageCallback;
public FilterMessage FilterMessageCallback 
{
  get { return m_FilterMessageCallback; }
  set { m_FilterMessageCallback = value; }
}
界面中的代码

FilterMessage FilterMessageCallback { get; set; }

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

只需使用一个backing字段:

private FilterMessage m_FilterMessageCallback;
public FilterMessage FilterMessageCallback 
{
  get { return m_FilterMessageCallback; }
  set { m_FilterMessageCallback = value; }
}
界面中的代码

FilterMessage FilterMessageCallback { get; set; }

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

谢谢大家。我只是不知道VS 2008编译器在幕后可能在做什么-我假设它做的就是这个东西的一个版本?是的,它做的完全一样。谢谢大家。我只是不知道VS 2008编译器在幕后可能在做什么——我假设它做的正是这个东西的一个版本?是的,它做的完全相同。