C#学习教程:如何为泛型类编写C#扩展方法我想在System.Web.Mvc.ViewPage类中添加一个扩展方法。这个扩展方法应该是什么样的?我的第一个直觉想法是:namespaceSystem.Web.Mvc{publicstaticclassViewPageExtensions{publicstaticstringGetDefaultPageTitle(thisViewPagev){}}}解决方案一般的解决方案是这个答案。扩展System.Web.Mvc.ViewPage类的具体解决方案是我的答案,从通用解决方案开始。不同之处在于,在特定情况下,您需要通用类型的方法声明和将通用类型强制为引用类型的声明。我当前的机器上没有安装VS,但我认为语法是:}}}谢谢leddt。这样做会产生错误:类型“TModel”必须是引用类型才能将其用作泛型类型或方法中的参数“TModel”,该类型或方法指向产生此解决方案的页面:namespaceSystem.Web.Mvc{publicstaticclassViewPageExtensions{publicstaticstringGetDefaultPageTitle(thisViewPagev)whereT:class{return"";}它只需要一个函数的通用类型说明符:}}}编辑:错过了几秒钟!命名空间System.Web.Mvc{publicstaticclassViewPageExtensions{publicstaticstringGetDefaultPageTitle(thisViewPageview)whereT:class{return"";您可能还需要/想要将“new()”限定符添加到泛型类型(即“whereT:class,new()”以强制T既是引用类型(类)又具有无参数constructor.GlennBlock有一个很好的例子来实现IEnumerable的ForEach扩展方法。从他的博客文章:publicstaticclassIEnumerableUtils{publicstaticvoidForEach(thisIEnumerablecollection,Actionaction){foreach(Titemincollection)action(item);如果您希望扩展仅适用于指定的类型,那么只需要指定要处理的实际类型就像...publicstaticstringGetDefaultPageTitle(thisViewPagev){...}注意智能感知仅在声明具有匹配类型(在本例中)方法的ViewPage时显示扩展。另外,最好不要使用System.Web.Mvc命名空间,我知道没有必要在usings部分包含你的命名空间,但如果你为扩展函数创建自己的扩展命名空间,它会更容易维护。下面是Razor视图的示例:publicstaticclassWebViewPageExtensions{publicstaticstringGetFormActionUrl(thisWebViewPageview){returnstring.Format("/{0}/{1}/{2}",view.GetController(),view.GetAction(),view.GetId());}publicstaticstringGetController(thisWebViewPageview){returnGet(view,"controller");}publicstaticstringGetAction(thisWebViewPageview){returnGet(view,"action");}publicstaticstringGetId(thisWebViewPageview){returnGet(view,"id");}privatestaticstringGet(WebViewPageview,stringkey){returnview.ViewContext.Controller.ValueProvider.GetValue(key).RawValue.ToString();你真的不需要使用泛型版本,因为泛型版本扩展了非泛型版本,所以只要把它放在非泛型基类中就大功告成了:)以上是C#学习教程:How你写C#通用类型类的扩展方法吗全部内容分享,如果对大家有用还需要详细了解C#学习教程,希望大家多多关注——本文收集自网络,并非代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
