我正准备为带有单个参数的事件args创建一个通用的EventArgs类:
public class EventArg<T> : EventArgs
{
// Property variable
private readonly T p_EventData;
// Constructor
public EventArg(T data)
{
p_EventData = data;
}
// Property for EventArgs argument
public T Data
{
get { return p_EventData; }
}
}
Run Code Online (Sandbox Code Playgroud)
在我这样做之前,C#是否具有内置于该语言的相同功能?我似乎记得在C#2.0发布时遇到类似的东西,但现在我找不到它.
换句话说,我是否必须创建自己的通用EventArgs类,或者C#是否提供了一个?谢谢你的帮助.
最近我一直想知道这段代码之间是否有任何显着差异:
public event EventHandler<MyEventArgs> SomeEvent;
Run Code Online (Sandbox Code Playgroud)
还有这个:
public delegate void MyEventHandler(object sender, MyEventArgs e);
public event MyEventHandler SomeEvent;
Run Code Online (Sandbox Code Playgroud)
他们都做同样的事情,我无法分辨出任何差异.虽然我注意到.NET Framework的大多数类都为其事件使用自定义事件处理程序委托.这有什么特别的原因吗?
我一直在尝试创建一个通用事件.基本上它应该是这样的:
namespace DelegateTest
{
class Program
{
static void Main(string[] args)
{
var lol = new SomeClass();
lol.SomeEvent += handler;
}
static void handler(object sender, SomeDerivedClass e)
{
}
}
class SomeClass
{
public delegate void SomeEventDelegate<in T>(object sender, T data);
public event SomeEventDelegate<ISomeInterface> SomeEvent;
}
interface ISomeInterface
{
}
class SomeDerivedClass : ISomeInterface
{
}
}
Run Code Online (Sandbox Code Playgroud)
我想允许用户传递任何委托,其中第二个参数派生自"ISomeInterface".
"in"指定反差,对吗?这意味着如果API期望更通用的东西,你可以传递更具体的东西(在我的基础"ISomeInterface"将是通用的,而我的"SomeDerivedClass"将是特定的.)但是,我被告知我的编译器"方法处理程序没有重载匹配DelegateTest.SomeClass.SomeEventDelegate."
我想知道为什么这不起作用.如果是这样会导致什么问题?或者我错过了一些工作的东西?
提前致谢!
我一直在想这一段时间; 但尤其是因为过去几周我一直更专注于前端开发.这可能听起来像一个广泛的问题,但希望有一个答案或理由:
为什么.NET Web控件事件处理程序不通用?
我问的原因是由于强类型事件处理程序的精确和优雅.在我的项目中,无论何时需要,我倾向于使用.NET泛型EventHandler<T>委托,它自.NET 2.0以来一直存在; 如这里讨论.
public delegate void EventHandler<TArgs>(object sender, TArgs args) where TArgs : EventArgs
Run Code Online (Sandbox Code Playgroud)
对此进行扩展并为其定义类型也是相对简单的sender,就像这样.
public delegate void EventHandler<TSender, TArgs>(TSender sender, TArgs args) where TArgs : EventArgs
Run Code Online (Sandbox Code Playgroud)
每当使用.NET控件时,偶尔我会发现自己在代码隐藏而不是ASPX文件中绑定事件处理程序,然后object如果我需要进行任何额外的检查或更改,则必须将其转换为所需的类型.
定义
public class Button : WebControl, IButtonControl, IPostBackEventHandler
{
public event EventHandler Click;
}
Run Code Online (Sandbox Code Playgroud)
履行
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
this.MyButton.Click += new EventHandler(MyButton_Click);
}
protected void MyButton_Click(object sender, EventArgs e)
{
// type cast and …Run Code Online (Sandbox Code Playgroud) 在.NET框架中是否已经提供了类似的东西?
public class EventArgs<T> : EventArgs {
private readonly T data;
public EventArgs(T data) {
this.data = data;
}
}
Run Code Online (Sandbox Code Playgroud)
我知道有一个通用的事件处理程序,我有点惊讶我找不到一个通用的EventArgs类.
谢谢
使用泛型DataEventArgs<TData>类,而不是在事件声明中声明和使用自定义EventArgs继承类,违反.Net事件"模式"约定?或者在某些情况下考虑不好的做法?
(命名事件args 的命名约定是使用事件名称并附加后缀"EventArgs".使用DataEventArgs<TData>省略事件名称,尽管它显示了传输的数据类型.)
您可能会争辩说,通用DataEventArgs类对扩展是封闭的,例如添加另一个属性,除非您可以修改用于TData的类.
更长的解释:
在声明包含一些数据的标准委托事件时,我理解标准事件"模式"约定是使用通用的EventHandler委托声明它:
public event EventHandler<SomethingHappendEventArgs> SomethingHappend;
Run Code Online (Sandbox Code Playgroud)
具体SomethingHappendEventArgs是什么声明的东西
public class SomethingHappendEventArgs : EventArgs
{
public SomeDataType Value { get; private set; }
public SomethingHappendEventArgs(SomeDataType data)
{
this.Value = data;
}
}
Run Code Online (Sandbox Code Playgroud)
当谷歌搜索时,我注意到有几个Microsoft命名空间提供了一个通用的DataEventArgs类,(包括Microsoft.Practices.Prism.Events).但是,我无法找到任何推荐或约定指示何时使用它而不是自定义事件数据类,如SomethingHappendEventArgs,反之亦然.
所以,只要有一个数据块,我要在事件数据包括,是否有我应使用自定义的事件数据类,像SomethingHappendEventArgs,而不是宣布这样的事件的任何原因?
public event EventHandler<DataEventArgs<SomeDataType>> SomethingHappend;
Run Code Online (Sandbox Code Playgroud)
泛型DataEventArgs可以声明如下:
public class DataEventArgs<TData> : EventArgs
{
public TData Value { get; private set; }
public DataEventArgs(TData value)
{
this.Value = value;
}
}
Run Code Online (Sandbox Code Playgroud)