我需要使用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或其他项目的主要语言。
谢谢,
答案 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;
}
}
}
对于全局可用的常量值(例如应用程序名称,版本号等),它通常可以很好地工作。