小编emk*_*tra的帖子

DID微软如何做到这一点?(关于他们的.NET HttpServerUtility类的OO问题)

HttpServerUtility包含一个名为UrlEncode的公共函数.它不是共享功能.HttpServerUtility没有任何公共构造函数.

这样做失败了:

Dim encodeMe As String = "a string to be encoded!"
HttpServerUtility.UrlEncode(encodeMe) 'Bombs out
Run Code Online (Sandbox Code Playgroud)

这是有效的,也是微软的说法:

Dim instance As HttpServerUtility
Dim encodeMe As String = "a string to be encoded!"

instance.UrlEncode(encodeMe ) 'Works!
Run Code Online (Sandbox Code Playgroud)

他们是如何做到这一点的?您无法使用构造函数实例化它的实例,但只能通过引用HttpServerUtility.UrlEncode来访问UrlEncode.

编辑:虽然我非常喜欢每个人进入一个大的OO辩论,我相信问题是错误的MSDN文档."Dim instance As HttpServerUtility"这一行应该是"Dim instance As HttpServerUtility = Context.Server"我包含的代码(来自MSDN文档)实际上不起作用,而是抛出一个空引用异常 - 就像你一样期待.谢谢你,杰森!

.net oop

8
推荐指数
1
解决办法
1038
查看次数

证明我错了:VB.NET HtmlHelper扩展方法不适用于VSC的MVC 4

无论我尝试多少次,我都无法使用我的HTML Helper扩展方法.这是我创建的测试步骤,如果有人想自己尝试一下:

  1. 使用Visual Studio 2012,我使用"Internet应用程序"项目模板创建一个新的"Visual Basic ASP.NET MVC 4 Internet Web应用程序".

  2. 我创建了一个文件夹 "~/Views/Helpers"

  3. 我创建一个文件"DisplayForPropertyHelper.vb"并添加以下代码:

    Namespace TestProject.Extensions
        Public Module HtmlHelperExtensions
            <Extension()>
            Public Function DisplayForProperty(helper As HtmlHelper) As MvcHtmlString
                Return MvcHtmlString.Create("TEST")
            End Function
        End Module
    End Namespace
    
    Run Code Online (Sandbox Code Playgroud)
  4. 我打开"~/Views/Web.config"并更改以下内容(我添加扩展名称空间):

    <system.web.webPages.razor>
        <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <pages pageBaseType="System.Web.Mvc.WebViewPage">
          <namespaces>
            <add namespace="System.Web.Mvc" />
            <add namespace="System.Web.Mvc.Ajax" />
            <add namespace="System.Web.Mvc.Html" />
            <add namespace="System.Web.Optimization"/>
            <add namespace="System.Web.Routing" />
            <add namespace="TestProject.Extensions"/>
          </namespaces>
        </pages>
    </system.web.webPages.razor>
    
    Run Code Online (Sandbox Code Playgroud)
  5. 编译项目

  6. 选择任何剃刀视图文件,然后键入@Html.Display- 您将看到扩展方法未显示.

  7. 添加到剃刀视图文件,@Imports TestProject.Extensions然后保存并关闭该文件.

  8. 重新打开文件,然后键入 …

vb.net extension-methods html-helper asp.net-mvc-4 visual-studio-2012

6
推荐指数
1
解决办法
3061
查看次数

C#.NET将一组InterfaceImplementingClass对象传递给一个采用Interface对象集合的例程

我有一个例程

public void SomeRoutine(List<IFormattable> list) { ... }
Run Code Online (Sandbox Code Playgroud)

然后我尝试调用这个例程

List<Guid>list = new List<Guid>();
list.Add(Guid.NewGuid());
SomeRoutine(list);
Run Code Online (Sandbox Code Playgroud)

并且它因编译时错误而失败.System.Guid实现了IFormattable,但我得到的错误是

无法从'System.Collections.Generic.List'转换为'System.Collections.Generic.List'

注意:如果您只使用Guids数组,则会出现相同的错误.泛型不是原因....

但!鉴于这种

public void SomeRoutine2(IFormattable obj) { ... }
Run Code Online (Sandbox Code Playgroud)

还有这个

Guid a = Guid.NewGuid();
SomeRoutine2(a);
Run Code Online (Sandbox Code Playgroud)

它汇编!所以问题是为什么?为什么我能够将Guid对象(实现IFormattable)传递给接受IFormattable对象的例程,但是当我尝试将其扩展到集合(通用列表,数组或其他任何东西)时,我得到了转换错误?

我有一段时间找到答案,我认为这将是最好的去处.

.net c# generics clr interface

5
推荐指数
2
解决办法
1762
查看次数