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进行类型定义,而不需要重新定义它来获得类似的行为。


当前回答

在c# 10中,你可以这样做

global using Bar = Foo

它的工作方式类似于项目中的类型定义。

我还没有对它进行深入测试,所以可能会有一些怪癖。

我用它就像

global using DateTime = DontUseDateTime

其中DontUseDateTime是一个标记为Obsolete的结构体,以强制人们使用NodaTime。

其他回答

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

public delegate GenericHandler EventHandler<EventData>

这会使它更短。但是下面的建议怎么样:

使用Visual Studio。这样,当你打字的时候

gcInt.MyEvent += 

它已经从智能感知中提供了完整的事件处理程序签名。按TAB键,它就在那里。接受生成的处理程序名称或更改它,然后再次按TAB键自动生成处理程序存根。

我会做

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

自从c# 10.0引入以来,我们现在有了全局的using指令。

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

这在全局作用域中(贯穿整个项目和对它的所有引用)引入CustomerList作为List<Customer>的别名。

虽然我希望能够限制它的范围(例如“内部使用”),但这实际上在c#中实现类型定义变量方面做得很好。

Jon给出了一个很好的解决方案,我不知道你能做到!

有时我要做的是从类继承并创建它的构造函数。如。

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

不是最好的解决方案(除非您的程序集被其他人使用),但它是有效的。

在c# 10中,你可以这样做

global using Bar = Foo

它的工作方式类似于项目中的类型定义。

我还没有对它进行深入测试,所以可能会有一些怪癖。

我用它就像

global using DateTime = DontUseDateTime

其中DontUseDateTime是一个标记为Obsolete的结构体,以强制人们使用NodaTime。