如何在 VS 2005 中为委托回调实现自动属性

Posted

技术标签:

【中文标题】如何在 VS 2005 中为委托回调实现自动属性【英文标题】:How to implement automatic properties in VS 2005 for a delegate callback 【发布时间】: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 中复制此功能?

感谢您的时间。

【问题讨论】:

【参考方案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; 

【讨论】:

以上是关于如何在 VS 2005 中为委托回调实现自动属性的主要内容,如果未能解决你的问题,请参考以下文章

vs2005 datagridview内容自动换行?

如何用VS2005制作Web安装程序

C# 委托和事件:一个简单的例子

VS 2005C#中datagridview中存储的数据过多时,怎么实现自动分页

vs2005中如何添加控件呀

【很急】VS2005项目属性在哪里啊??