Joh*_*ant 2 .net oop extension-methods
我希望在.NET框架中有一个特定的功能,但事实并非如此.我希望有一个DBDataReader.GetString(或GetDateTime,GetInt32等)重载接受字段名而不是索引.使用字段名称可以更容易地维护IMO,但GetXxx方法只接受字段位置.
我可以通过使用扩展方法将这些添加到我的项目中(至少在有限的容量中,以满足我的直接需求),但有些事情感觉不对.除了我必须为每个新项目重复这个过程的明显问题之外,有什么理由不去做我正在考虑的事情吗?
例如,我是否试图改写框架以适应我的想法?我会离开那个不得不修改我的代码(可能是我)的可怜人,试图弄清楚发生了什么事吗?我是否违反了OOP的一些核心原则?
只是寻找指导和观点.谢谢.
这正是扩展方法能够解决的场景之一.您需要在您无法控制的类型上尚未提供的功能.
至于复制每个项目中的代码,你需要做的是创建一个类库项目来存储这样的公共/共享代码,然后在每个Solution中包含该项目并使用项目引用或编译项目,将生成的程序集放在共享位置,并将其作为文件项目引用包含在内.
请记住,扩展方法仅在"引入范围"时才可用.这意味着如果您将扩展方法定义为:
namespace CustomExtensions
{
public static class StringExtensions
{
public static string InvariantToString(this int value)
{
return value.ToString(System.Globalization.CultureInfo.InvariantCulture);
}
}
}
Run Code Online (Sandbox Code Playgroud)
除非代码文件包含带有using指令的CustomExtensions命名空间,否则它在任何字符串值上都不可见.
因此,建议您不要将自己的扩展放在.NET Framework定义的命名空间中,而应使用自己的命名空间.这样做可以最大限度地减少混淆的可能性,因为除非明确引入范围,否则您的扩展将无法使用.
另外,请记住,如果您提供的扩展方法与"内置" 方法具有完全相同的签名,则扩展方法将永远不可见或可调用 - 内置方法始终优先.如果Microsoft决定在更高版本的Framework中包含该功能并使用您选择的完全相同的签名,则将不再调用您的扩展方法.
定义扩展方法时,实际上并未重新定义要扩展的基础类型,因此您没有自己的"单个版本".所有扩展方法提供了一种在静态类中调用静态方法的方便且更自然的方法.实际上,使用上面的示例扩展方法,这些是等效的调用:
int i = 42;
Console.WriteLine(i.InvariantToString());
Console.WriteLine(StringExtensions.InvariantToString(i));
Run Code Online (Sandbox Code Playgroud)
虽然Microsoft确实对框架中包含或未包含的内容进行了大量考虑,但他们无法了解可能会推动您对特定功能的特定需求的特定用例.是的,大多数时候他们做得很好,并提供"开箱即用"的功能,但有时他们没有.(一个很好的例子是缺少一个InvariantToString()方法.)