在C#中的typedef等效

在C#中是否有一个typedef等价物,或者有些类似的行为? 我做了一些谷歌search,但我看起来似乎是负面的。 目前我有一个类似于以下的情况:

class GenericClass<T> { public event EventHandler<EventData> MyEvent; public class EventData : EventArgs { /* snip */ } // ... snip } 

现在,火箭科学家并没有弄清楚,当试图为这个事件实现一个处理程序时,这很快就会导致大量的input(为可怕的双关语表示歉意)。 它最终会是这样的:

 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(); } 

除了我的情况,我已经在使用一个复杂的types,而不仅仅是一个int。 如果有可能简化这一点就好了…

编辑:即。 也许是敲入EventHandler而不需要重新定义它来获得类似的行为。

不,不存在typedef的真正等价物。 你可以在一个文件中使用'using'指令,例如

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

但这只会影响该源文件。 在C和C ++中,我的经验是, typedef通常在被广泛包含的.h文件中使用,因此可以在整个项目中使用一个typedef 。 这种能力在C#中是不存在的,因为在C#中没有#includefunction可以让你在一个文件中包含using指令。

幸运的是,您提供的示例有一个修复 – 隐式方法组转换。 您可以将您的活动订阅线更改为:

 gcInt.MyEvent += gcInt_MyEvent; 

🙂

乔恩真的给了一个很好的解决scheme,我不知道你能做到这一点!

有时我采取的是从class级inheritance和创build它的build设者。 例如

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

不是最好的解决scheme(除非你的程序集被其他人使用),但它的工作原理。

如果你知道你在做什么,你可以用隐式操作符定义一个类来在别名类和实际类之间进行转换。

 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#支持事件委托的一些inheritance的协方差,所以像这样的方法:

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

可以用来订阅你的事件,不需要显式的强制转换

 gcInt.MyEvent += LowestCommonHander; 

你甚至可以使用lambda语法,而intellisense将会为你完成:

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

我认为没有typedef。 你只能定义一个特定的委托types,而不是GenericClass中的通用委托types

 public delegate GenericHandler EventHandler<EventData> 

这会使它更短。 但是,下面的build议呢?

使用Visual Studio。 这样,当你键入

 gcInt.MyEvent += 

它已经提供了来自Intellisense的完整的事件处理程序签名。 按Tab键,它在那里。 接受生成的处理程序名称或将其更改,然后再次按Tab键自动生成处理程序存根。

这里是它的代码,享受!,我从dotNetReference中select了types命名空间行中的“使用”语句106 http://referencesource.microsoft.com/#mscorlib/microsoft/win32/win32native.cs

 using System; using System.Collections.Generic; namespace UsingStatement { using Typedeffed = System.Int32; using TypeDeffed2 = List<string>; class Program { static void Main(string[] args) { Typedeffed numericVal = 5; Console.WriteLine(numericVal++); TypeDeffed2 things = new TypeDeffed2 { "whatever"}; } } } 

您可以使用我创build的开放源代码库和名为LikeType的 NuGet包,它将为您提供您正在寻找的GenericClass<int>行为。

代码如下所示:

 public class SomeInt : LikeType<int> { public SomeInt(int value) : base(value) { } } [TestClass] public class HashSetExample { [TestMethod] public void Contains_WhenInstanceAdded_ReturnsTrueWhenTestedWithDifferentInstanceHavingSameValue() { var myInt = new SomeInt(42); var myIntCopy = new SomeInt(42); var otherInt = new SomeInt(4111); Assert.IsTrue(myInt == myIntCopy); Assert.IsFalse(myInt.Equals(otherInt)); var mySet = new HashSet<SomeInt>(); mySet.Add(myInt); Assert.IsTrue(mySet.Contains(myIntCopy)); } }