【问题标题】:Is it possible to create VB.net module-like in C# on .Net 3.5?是否可以在 .Net 3.5 上的 C# 中创建类似 VB.net 的模块?
【发布时间】:2010-11-13 07:41:30
【问题描述】:

我需要为我的 Asp.net MVC 项目使用 VB.net 的一些功能,即 Module。但我发现 C# 不能像 VB.net 那样处理 Module 。请看下面的代码。

VB.Net - 全球化项目

Public Module [Module Name]
    Public Const WebsiteName As String = "[My Website Name]"
End Module

VB.Net - Asp.net MVC 查看页面

<%@ Import Namespace="[Globalization Project Namespace]" %>

<%= WebsiteName %>

C#.Net - Asp.net MVC 查看页面

<%@ Import Namespace="[Globalization Project Namespace]" %>

<%= WebsiteName                // Error because C# doesn't understand this statement %>
<%= [Module Name].WebsiteName  // It works fine. %>

我认为 C# 将所有模块都视为类。所以,我不能直接调用它而不给出模块名称。你有解决这个问题的想法吗?

PS.1 我知道。模块不正确的 OOP。但它简短而强大。

PS.2 我可以将 VB.net 用于全球化项目,因为所有源代码都将由我的自定义宏生成。但我不喜欢在 VB.net 中编写源代码。所以,我不使用 VB.net 作为 Asp.net MVC View Page 或其他项目的主要语言。

谢谢,

【问题讨论】:

    标签: c# asp.net-mvc vb.net .net-3.5


    【解决方案1】:

    不,C# 没有任何等效于 VB.NET 的模块。

    (在 VB.NET 中,访问将由编译器完全限定。)

    不过,您可能对 Eric Lippert 的 this blog post 感兴趣,谈论在未来版本中包含“顶级”方法的可能性。

    【讨论】:

      【解决方案2】:

      静态类是 VB 模块的 C# 等价物:

      public static class MyCSharpModule
      {
          public const string WebsiteName = "[My Website Name]";
      }
      

      嗯,对于模块的 C# 用户来说也是如此,因为在 C# 中您必须指定类名,即使它是作为 VB 模块创建的。如果从 VB 引用,如果来自 C# dll,则需要指定类名,但如果来自 VB dll,则不需要指定类名...

      您可以尝试对 Page 类使用扩展:

      public static class MyExtentions
      {
          public static string WebsiteName(this System.Web.Mvc.ViewMasterPage page)
          {
              return "[My Website Name]";
          }
      }
      

      在页面中,您可以将其作为页面上的方法调用:

      <%= WebsiteName(); %>
      

      【讨论】:

      • 不等价。因为我必须在调用它的字段属性之前指定类名。
      • 我只是试试。但是我需要使用这个关键字来调用你的方法。而且,这个想法不能在其他上下文中使用,因为它是扩展方法。
      • 很公平。无论如何,创建一个继承 System.Web.Mvc.ViewMasterPage 类的新站点类的解决方案会更好。通常,您应该尽可能使用这种方法。仅当您无法控制使用哪个类时才应使用扩展方法。
      【解决方案3】:

      在 C# 中没有直接等效于 VB.NET 模块,但是,对于大多数用途,我发现使用公共静态类(在您的最“顶级”命名空间中)就足够了。
      (不过,您仍然需要使用类名来限定成员和方法)。

      类似:

      namespace MyApplication
      {
         public static class Globals
         {
            public const string app_name = "This is my application name!";
         }
      }
      

      并像这样使用它:

      namespace ConsoleApplication1
      {
          class Program
          {
              static void Main(string[] args)
              {
                  string s = Globals.app_name;                        
              }
          }
      }
      

      对于全局可用的常量值(例如应用程序名称、版本号等),它通常工作得很好。

      【讨论】:

        【解决方案4】:

        我发现了一些可能性。让我们看看我的源代码。

        C# - 全球化项目

        namespace [SolutionName].Globalization.Shared
        {
            public class Site : System.Web.Mvc.ViewMasterPage
            {
                public static [PropertyName] { get;set; }
            }
        }
        

        我想,你知道接下来会发生什么!

        C# - Asp.net MVC 视图页面在同一视图部分

        <%@ Master Language="C#" Inherits="[SolutionName].Globalization.Shared.Site" %>
        <%@ Import Namespace="[SolutionName].Globalization.Shared" %>
        
        <%= [PropertyName] %>
        

        C# - Asp.net MVC 视图页面在同一视图部分

        <%@ Import Namespace="[SolutionName].Globalization.Shared" %>
        
        <%= Site.[PropertyName] %>
        

        C# - 不同视图部分中的 Asp.net MVC 视图页面

        <%@ Import Namespace="[SolutionName].Globalization" %>
        
        <%= Shared.Site.[PropertyName] %>
        

        对吗?我认为这是非常漂亮的源代码。你有什么建议吗?请告诉我。

        PS.1 我唯一担心的是我的全球化项目。这很奇怪,因为这个项目中的类几乎都继承自 Asp.net MVC 项目中的 View Page 类。

        PS.2 不要担心创建上面的代码。因为我将使用 VS Macro 来生成和修改它们。

        谢谢,

        【讨论】:

        • 我不认为它非常优雅,因为你在滥用继承 IMO。我认为明确指定一个类的名称会更好,例如"SiteSettings.WebSiteName"。
        • 我知道。但在 Asp.net MVC 项目中,短资源名称非常有用。因为它可以减少视图页面中的整体源代码。此外,此源代码将在开发者保存资源文件(*.resx)后自动生成。因此,滥用/黑客攻击不是问题。另一方面,我不明白为什么 c# 不允许我使用 Module 语法。它喜欢将 vb.net 语法转换为 c# 语法,而不是直接引用。谢谢。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-24
        • 1970-01-01
        • 2011-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多