当前位置: 首页 > 编程语言 > C#

C#接口静态方法调用泛型分享

时间:2023-04-10 20:02:09 C#

C#接口静态方法调用泛型有没有简单的方法,如果可以的话,不用实例化对象:interfaceI{staticstringGetClassName();}publicclassHelper{staticvoidPrintClassName()whereT:I{Console.WriteLine(T.GetClassName());}}尝试使用扩展方法:publicinterfaceIMyInterface{stringGetClassName();}publicstaticclassIMyInterfaceExtensions{publicstaticvoidPrintClassName(thisTinput)whereT:IMyInterface{Console.WriteLine(input.GetClassName());这允许您添加静态扩展/实用方法,但您仍然需要IMyInterface实现的实例。你不能有一个带有静态方法的接口,因为它没有意义,它们是没有实例的实用方法,所以它们实际上没有类型。您不能继承静态方法。您的代码不会以任何方式编译,因为接口因此不能使用静态方法。littleguru的引述:.NET中的继承仅适用于实例库。静态方法是在类型级别定义的,而不是在实例级别。这就是为什么覆盖对静态方法/属性/事件不起作用的原因......静态方法只在内存中保存一次。没有为它们创建虚拟表等。如果您在.NET中调用实例方法,它总是被赋予当前实例。这是由.NET运行时隐藏的,但它确实发生了。每个实例方法都将第一个参数作为指向运行该方法的对象的指针(引用)。静态方法不会发生这种情况(因为它们是在类型级别定义的)。编译器应该如何决定调用哪个方法?很久以前我也试过在界面上设置一个静态方法,现在不知道为什么。我为此添加了书签,所以它可能会有所帮助:使用扩展方法与静态方法交互如果你只是在类型名称之后,你可以这样做:姓名);在接口定义上声明静态属性、事件或方法不被视为合法定义。这是因为一个接口被认为是一个契约,因此代表了该接口的每个客户端实例将实现的内容。静态声明基本上声明静态成员不需要物理客户端实现来执行所需的功能,这与接口的一般概念不一致:提供经过验证的合同。答案是合格的“不是真的,而是排序的”。您可以为给定接口的所有实现者提供静态扩展方法,然后可以从属性或其他方法中的实现者调用。例如:使用系统;使用System.Collections.Generic;使用System.Linq;使用系统文本;命名空间InterfacesWithGenerics{类程序{staticvoidMain(string[]args){Helper.PrintClassName(newExample());控制台.ReadLine();}}publicclass示例:I{#regionIMemberspublicstringClassName{get{returnthis.GetClassName();}}#endregion}publicinterfaceI{stringClassName{get;}}publicclassHelper{publicstaticvoidPrintClassName(Tinput)whereT:I{Console.WriteLine(input.GetClassName());}}publicstaticclassIExtensions{publicstaticstringGetClassName(thisIyourInterface){returnyourInterface.GetType().ToString();这里我们有一个定义我们关心的属性的接口(I),以及一个静态扩展方法(GetClassName),它适用于其类型的所有成员,这些成员完成获取我们想要的信息的繁琐工作。我们有一个实现I接口的类(Example),因此当我们调用传递Example实例的静态帮助程序类时,它会在其上运行静态方法。不幸的是,方法本身直接将类型T作为变量引用是无效的,您必须将实例传递给应用程序。您可以将className定义为特定类的属性。这是在.net中存储元数据的首选方法。这样,您可以在不需要实例的情况下查询给定类的属性。以上就是C#学习教程分享的全部内容:C#接口静态方法调用泛型。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: