c#中是否有类似的类型定义,或者以某种方式获得类似的行为?我在谷歌上搜了一下,但到处都是否定的。目前我的情况类似如下:
class GenericClass<T>
{
public event EventHandler<EventData> MyEvent;
public class EventData : EventArgs { /* snip */ }
// ... snip
}
现在,当尝试为该事件实现一个处理程序时,这可能很快导致大量输入(为这个可怕的双关语道歉),这并不需要一个火箭科学家来理解。结果是这样的:
GenericClass<int> gcInt = new GenericClass<int>;
gcInt.MyEvent += new EventHandler<GenericClass<int>.EventData>(gcInt_MyEvent);
// ...
private void gcInt_MyEvent(object sender, GenericClass<int>.EventData e)
{
throw new NotImplementedException();
}
只不过,在我的例子中,我已经使用了复杂类型,而不仅仅是int型。如果能简化一下就好了……
编辑:ie。也许是对EventHandler进行类型定义,而不需要重新定义它来获得类似的行为。
对于非密封类,只需从它们继承:
public class Vector : List<int> { }
但是对于密封类,可以用这样的基类来模拟类型定义行为:
public abstract class Typedef<T, TDerived> where TDerived : Typedef<T, TDerived>, new()
{
private T _value;
public static implicit operator T(Typedef<T, TDerived> t)
{
return t == null ? default : t._value;
}
public static implicit operator Typedef<T, TDerived>(T t)
{
return t == null ? default : new TDerived { _value = t };
}
}
// Usage examples
class CountryCode : Typedef<string, CountryCode> { }
class CurrencyCode : Typedef<string, CurrencyCode> { }
class Quantity : Typedef<int, Quantity> { }
void Main()
{
var canadaCode = (CountryCode)"CA";
var canadaCurrency = (CurrencyCode)"CAD";
CountryCode cc = canadaCurrency; // Compilation error
Concole.WriteLine(canadaCode == "CA"); // true
Concole.WriteLine(canadaCurrency); // CAD
var qty = (Quantity)123;
Concole.WriteLine(qty); // 123
}
c#支持一些事件委托的继承协方差,所以像这样的方法:
void LowestCommonHander( object sender, EventArgs e ) { ... }
可以用来订阅您的事件,没有显式强制转换所需
gcInt.MyEvent += LowestCommonHander;
你甚至可以使用lambda语法,智能感知将为你完成:
gcInt.MyEvent += (sender, e) =>
{
e. //you'll get correct intellisense here
};