在C#中是否有typedef等价物,或者某种类似的行为?我做了一些谷歌搜索,但我看到的每个地方似乎都是负面的.目前我的情况类似于以下情况:
class GenericClass{ public event EventHandler MyEvent; public class EventData : EventArgs { /* snip */ } // ... snip }
现在,当试图为该事件实现处理程序时,并不需要火箭科学家弄清楚这会很快导致大量输入(为可怕的双关语道歉).它最终会像这样:
GenericClassgcInt = new GenericClass ; gcInt.MyEvent += new EventHandler .EventData>(gcInt_MyEvent); // ... private void gcInt_MyEvent(object sender, GenericClass .EventData e) { throw new NotImplementedException(); }
除了在我的情况下,我已经使用了复杂类型,而不仅仅是一个int.如果有可能简化这一点,那就太好了......
编辑:即.也许键入定义EventHandler而不是需要重新定义它以获得类似的行为.
不,没有类似typedef的真正等价物.您可以在一个文件中使用'using'指令,例如
using CustomerList = System.Collections.Generic.List;
但这只会影响该源文件.在C和C++中,我的经验是typedef
通常在.h文件中使用,这些文件被广泛包含 - 因此typedef
可以在整个项目中使用单个文件.C#中不存在该#include
功能,因为C#中没有允许您将using
指令包含在另一个文件中的功能.
幸运的是,您给出的示例确实有一个修复 - 隐式方法组转换.您可以将您的活动订阅行更改为:
gcInt.MyEvent += gcInt_MyEvent;
:)
乔恩真的给了一个很好的解决方案,我不知道你能做到这一点!
我使用的有时候是从类继承并创建它的构造函数.例如
public class FooList : List{ ... }
不是最好的解决方案(除非你的程序集被其他人使用),但它确实有效.
如果您知道自己在做什么,则可以使用隐式运算符定义一个类,以便在别名类和实际类之间进行转换.
class TypedefString // Example with a string "typedef" { private string Value = ""; public static implicit operator string(TypedefString ts) { return ((ts == null) ? null : ts.Value); } public static implicit operator TypedefString(string val) { return new TypedefString { Value = val }; } }
我实际上并不赞同这一点,并且从未使用过类似的东西,但这可能适用于某些特定情况.
C#支持一些事件委托的继承协方差,所以这样的方法:
void LowestCommonHander( object sender, EventArgs e ) { ... }
可用于订阅您的活动,无需显式转换
gcInt.MyEvent += LowestCommonHander;
您甚至可以使用lambda语法,智能感知将全部为您完成:
gcInt.MyEvent += (sender, e) => { e. //you'll get correct intellisense here };
我认为没有typedef.您只能定义特定的委托类型,而不是GenericClass中的通用委托类型,即
public delegate GenericHandler EventHandler
这会缩短它.但是以下建议呢:
使用Visual Studio.这样,当你输入
gcInt.MyEvent +=
它已经提供了Intellisense的完整事件处理程序签名.按TAB,就在那里.接受生成的处理程序名称或更改它,然后再次按TAB以自动生成处理程序存根.