与C#中的typedef等效

时间:2020-03-06 15:00:59  来源:igfitidea点击:

在C#中是否存在与typedef等价的东西,或者以某种方式获得了类似的行为?我已经进行了一些谷歌搜索,但是到处看起来都是负面的。目前,我的处境类似于以下情况:

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类型。如果可以简化一点,那就太好了...

编辑:即。也许可以对EventHandler进行类型定义,而不必重新定义它以获得类似的行为。

解决方案

不,没有typedef的真实等效项。我们可以在一个文件中使用" using"指令,例如

using CustomerList = System.Collections.Generic.List<Customer>;

但这只会影响该源文件。在C和C ++中,我的经验是,通常在广泛包含的.h文件中使用typedef,因此可以在整个项目中使用单个typedef。该功能在C#中不存在,因为C中没有#include功能,该功能允许我们将一个文件中的using指令包含到另一个文件中。

幸运的是,我们给出的示例确实具有修复隐式方法组转换的功能。我们可以将事件订阅行更改为:

gcInt.MyEvent += gcInt_MyEvent;

:)

我认为没有typedef。我们只能定义一个特定的委托类型,而不是GenericClass中的泛型类型,即

public delegate GenericHandler EventHandler<EventData>

这将使其更短。但是以下建议呢?

使用Visual Studio。这样,当我们键入

gcInt.MyEvent +=

它已经提供了Intellisense的完整事件处理程序签名。按TAB即可。接受或者更改生成的处理程序名称,然后再次按TAB键以自动生成处理程序存根。

乔恩(Jon)确实提供了一个不错的解决方案,但我不知道我们能做到这一点!

有时我求助于从类继承并创建其构造函数。例如。

public class FooList : List<Foo> { ... }

不是最好的解决方案(除非程序集被其他人使用),但是它可以工作。

C支持事件委托的某些继承的协方差,因此是这样的方法:

void LowestCommonHander( object sender, EventArgs e ) { ... }

可用于订阅活动,无需显式强制转换

gcInt.MyEvent += LowestCommonHander;

我们甚至可以使用lambda语法,智能感知将全部为我们完成:

gcInt.MyEvent += (sender, e) =>
{
    e. //you'll get correct intellisense here
};