是否可以在.Net 3.5上的C#中创建类似VB.net模块?

时间:2009-07-23 09:01:20

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

我需要使用VB.net的一些功能,这是我的 Asp.net MVC项目的模块。但是我发现C#不能像VB.net那样处理模块。请查看以下代码。

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或其他项目的主要语言。

谢谢,

4 个答案:

答案 0 :(得分:2)

不,C#与VB.NET模块没有任何等价物。

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

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

答案 1 :(得分:1)

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

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生成&amp;修改所有这些。

<强>谢谢,

答案 2 :(得分:0)

静态类是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(); %>

答案 3 :(得分:0)

在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;                        
        }
    }
}

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