【发布时间】:2020-08-31 22:34:48
【问题描述】:
我们有一个核心库 (CoreLibrary),将其包含在每个程序集中确实很有意义。 目前有很多扩展方法,在每个文件中我必须通过
包含命名空间using CoreLibrary;
是否有可能在每个程序集中隐式包含 using CoreLibrary,这样我就不必像 mscorlib 那样自己编写它了?原因不仅是为了节省输入,对于不知道存在扩展方法的用户也是如此。
原因如下。我有一个
interface IArray
{
int Size { get;}
// Returns data with a newly created array.
T[] GetData<T>();
// Returns data in an already existing array.
void GetData<T>(T[] data);
}
在实现 IArray 的每个类都必须实现这两种方法之前(我有其中的一些......)
class Array1D : IArray
{
public int Size { get;}
// Returns data with a newly created array.
T[] GetData<T>()
{
var data = new T[Size];
GetData(data);
return data;
}
// Returns data in an already existing array.
void GetData<T>(T[] data)
{
// Produce data
}
}
现在我认为我可以在接口中使用默认实现,这样我就可以为实现 IArray 的每个类摆脱每个完全相同的 GetData 实现。
interface IArray
{
int Size { get;}
// Returns data with a newly created array.
T[] GetData<T>()
{
var data = new T[Size];
GetData(data);
return data;
}
// Returns data in an already existing array.
void GetData<T>(T[] data);
}
到目前为止一切都很好,但我知道我总是需要强制转换为 IArray 才能访问不可行的默认实现,而且似乎使用默认实现现在还有其他方法。于是萌生了使用扩展方法的想法
public static class ArrayExtensions : IArray
{
public int Size { get;}
// Returns data with a newly created array.
public static T[] GetData<T>(this IArray array)
{
var data = new T[array.Size];
array.GetData(data);
return data;
}
}
效果很好,但是现在我必须包含命名空间,这主要是可以的,但是在您可以通过 Intellisense 直接查看您有什么方法之前,现在您不知道扩展方法如果你以前没用过。
【问题讨论】:
-
我无法想象这是可能的。使用最基本的 .Net 命名空间(例如“System”)甚至是不可能的,它需要在每个源文件中使用。除此之外,“隐式使用”对我来说不是一个好主意。这使您的命名空间与仅存在语言自己的类型的“上帝命名空间”相提并论,例如“int”或“bool”。
-
“像 mscorlib 一样” - 什么意思?甚至
using System;也不是隐含的——它需要是每个文件的;你能举例说明你的意思吗?但不,在常规 C# 中,隐式 using 指令不是一回事;你可以在剃须刀(cshtml)中做到这一点 -
@Sinatr 这是一个 using 指令 alias;不同的场景,虽然答案仍然是“不,它是每个文件/命名空间”
-
@msedi 重新编辑:考虑 LINQ - 一级语言功能(如果您使用
from x in foo语法等) - 通常基于扩展方法: 仍然需要你有正确的using指令。这似乎是一个文档问题,最重要的是......
标签: c#