C# 如何在VS2005中为委托回调实现自动属性
我正试图得到我在这里找到的TwainDotNet解决方案来编译,我已经束手无策了 这个解决方案显然是在VS2008中开发的,我在2005年工作,目前没有选择。我在2005年花了很多时间来编译这一切,我把我的错误减少到了两个,两个错误都是同一个问题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
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编译器在幕后可能在做什么——我假设它做的正是这个东西的一个版本?是的,它做的完全相同。