2017-05-31 90 views
1

我有一对夫妇的string扩展方法在装配A。在装配B,我不能,除非我在每个的.cs文件汇编B添加using A指令使用这些扩展方法。 有没有一种方法,在B组装项目配置指定使用的整个组件?类似于C++ stdafx.h是否可以指定使用指令的作用域?

感谢

+0

没有,每一个源代码文件需要自己'usings'从其他访问成员和类型命名空间。没有全局头文件来发布C++中的所有引用,至少在这个意义上并非如此。当您直接看到给定文件存在哪些依赖关系时,可以更轻松地查看成员的定义。 – HimBromBeere

+0

我打算提及VB的项目导入(请参阅@ Damien的[answer](https://stackoverflow.com/a/44287428/2226988))。我将它们全部删除,并在每个文件中只放入该文件所需的Imports指令。一个好的IDE可以帮助管理和代码说明它的含义。 –

+0

@Tom,我同意,但IDE不会检测到你的扩展方法在哪个程序集中就像它在类中所做的那样。 – Goldorak84

回答

2

using包括一个命名空间,而不是一个程序集。命名空间没有必要与其程序集具有相同的名称(即使它是通用约定)。

如果您希望在所有程序集中包含字符串扩展名是很自然的事情,因为它们代表了常用的功能,那么只需将它们放在顶级名称空间中即可。 MyCompanyName.MyApplication。这些范围在同一个或子级名称空间中的任何其他类的范围内。

(这一点假设你所有的命名空间遵循一个共同的根源如MyCompanyName...下降的普遍做法。)

+0

这是一个grrrreeat解决方案。我没有把顶级命名空间(例如'MyCompanyName.MyApplication'中的'MyCompanyName')包含在内。谢谢! – Goldorak84

+0

这很好澄清程序集vs命名空间,但是,我认为你是向后说明的:这是一个程序集的约定,它的_some_类型具有与程序集共享根名称的名称空间。 (这也是在程序集之后命名程序集清单文件(例如DLL)的约定。这就是为什么[docs](https://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext (v = vs.110).aspx)在描述类型时具有所有的细节。) –

+0

@TomBlodget是的,你是对的。我无法完全想到如何简洁地获得这些信息,但如果您认为可以,请随时编辑。 –

1

using导入一个命名空间到目前情况下使用完全合格的名称,以避免引用类等其他结构。

你可以(但一个坏主意)把在装配B中的一个命名空间中的所有构造,这样的话你就只需要一个using。坏主意是因为代码组织不力等

根据你的程序集B包含,你的字符串扩展函数很可能被放在同一个命名空间(而不像模特其他的东西是单独一个)。这似乎是一个体面的组织。

并且请注意,所有这些扩展函数可以在单独的.cs文件中,并且仍位于同一个命名空间中,因此需要一个声明将其全部导入。

E.g.

ExtensionA.cs
namespace AssemblyB.Strings.Extensions 
{ 
    public static string ExtensionA(this string source, ...) {...} 
} 

ExtensionB.cs
namespace AssemblyB.Strings.Extensions 
{ 
    public static string ExtensionB(this string source, ...) {...} 
} 

ExtensionC.cs
namespace AssemblyB.Strings.Extensions 
{ 
    public static string ExtensionC(this string source, ...) {...} 
} 

AssemblyA.cs
using AssemblyBStrings.Extensions; 

    ... 
    var b = "Hello World".ExtensionA().ExtensionB().ExtensionC(); 
+0

实际上,我的扩展已经在同一个程序集和命名空间中。我想消除的是需要为每个.cs文件添加'using'指令,因为我知道这些扩展名,但不一定全是我的同事 – Goldorak84

+1

Damien建议我回答不相信有这样的特点。也就是说,RedGate的ReSharper可以帮助它并自动放置使用。因此,如果这是一个开发人员便利的问题,那么它会为您做到,当然还有$。 – LB2

2

不,目前没有这种功能。

看到组装/项目一级支持什么功能一个有用的方法是看帮助命令行编译器。

Visual Basic使用Import语句与C#具有using指令相同,并且具有Project Imports的概念。而且,事实上,当我们在看的vbc /?的输出,我们可以看到:

        - LANGUAGE - 

/define:<symbol_list>    Declare global conditional compilation 
            symbol(s). symbol_list:name=value,... 
            (Short form: /d) 
/imports:<import_list>   Declare global Imports for namespaces in 
            referenced metadata files. 
            import_list:namespace,... 
/langversion:<number>    Specify language version: 
            9|9.0|10|10.0|11|11.0|12|12.0|14|14.0 
/optionexplicit[+|-]    Require explicit declaration of variables. 
/optioninfer[+|-]     Allow type inference of variables. 
/rootnamespace:<string>   Specifies the root Namespace for all type 
            declarations. 
/optionstrict[+|-]    Enforce strict language semantics. 
/optionstrict:custom    Warn when strict language semantics are not 
            respected. 
/optioncompare:binary    Specifies binary-style string comparisons. 
            This is the default. 
/optioncompare:text    Specifies text-style string comparisons. 

而且我们可以看到,有是/imports选项。

如果我们看一下csc /?相当于一节中,我们看到:

     - LANGUAGE - 
/checked[+|-]     Generate overflow checks 
/unsafe[+|-]     Allow 'unsafe' code 
/define:<symbol list>   Define conditional compilation symbol(s) (Short 
           form: /d) 
/langversion:<string>   Specify language version mode: ISO-1, ISO-2, 3, 
           4, 5, 6, or Default 

,我们可以看到,有没有相当于/using//usings。由此我们可以推断,在编译程序集时,无法通知C#编译器一套using指令适用于每个文件。

+0

这是一件很奇怪的事情,他们在VB中包含了这个特性,但在c#中却没有。谢谢! – Goldorak84

相关问题