使用解决方案作用域定义一个.NET扩展方法

6
我有一些“helper”风格的扩展方法,现在我经常使用它们(它们大多数都很简单、直观,并且是用于好的目的,所以请不要让这变成一个讨论是否应该使用它们的话题)。它们主要是扩展核心的.NET CLR类。
目前,我必须将保存我的扩展方法的“ExtensionMethods.cs”文件复制到解决方案中的每个新项目中,才能在多个项目中使用它们。
是否可以定义一个扩展来在解决方案中的多个项目中使用,或者将它们包装在“extensions”dll中,或者它们只限于项目范围内?
编辑:虽然“专用项目”答案完全有效,但我选择了marxidad的答案,因为我更喜欢他提供的方法。感谢所有迄今为止的答案,我已经upmodded它们所有,因为它们都是好的答案。
5个回答

9

如果您不想为扩展方法创建整个项目,可以将同一文件链接到不同的项目中而无需复制该文件:

  1. 在“解决方案资源管理器”中选择目标项目。
  2. 选择“项目”菜单。
  3. 选择“添加现有项”。
  4. 在“添加现有项”对话框中,选择要链接的项。
  5. 从“打开”按钮下拉列表中,选择“添加为链接”。

我也做了多年这样的事情,与使用共享程序集相比,这为我节省了很多麻烦。 - faulty

5
最好的方法是将它们全部放在一个项目中并创建一个DLL。然后,您可以将该项目作为项目引用包含或将DLL作为二进制引用包含(可能是更好的选择)。

如果您想在同一解决方案中使用多个项目的扩展函数,为什么要建议二进制引用?在这种情况下,应该使用项目引用。而且这也是主题开发人员的用例:“解决方案内的每个新项目”。 - Csaba Toth

2
您可以将您的扩展放在一个单独的项目中,然后将该项目包含到您正在创建的每个新解决方案中。
只需注意版本控制,例如,当其他应用程序尝试更改您的扩展项目时,使用该方法的所有项目都应重新测试。 Scott Dorman 在他的帖子中也是正确的:如果您不想让它们被更改,可以将它们编译为 DLL 库,然后将其包含在您的新项目中(而不是包含未编译的项目)。

1
创建一个针对.NET平台扩展的项目,并在每个应用程序项目中引用该项目。不言而喻:任何和所有平台相关的内容,只能放在该项目中;应用程序相关的内容则应该放在你的应用程序项目中。
你还可以查看一下各种平台库,例如Umbrella,它们提供了一套基础平台的扩展。

0
几个答案建议将扩展函数放入一个公共程序集中。这是正确的答案。但对于初学者来说,有一件奇怪的事情:智能感知无法提供足够的帮助。 假设我使用 ReplaceRange 函数/方法扩展了 ObservableCollection。 在移动扩展函数的类之后,首先编译器会报错: error CS1061: 'System.Collections.ObjectModel.ObservableCollection<WhateverDto>' does not contain a definition for 'ReplaceRange' and no extension method 'ReplaceRange' accepting a first argument of type 'System.Collections.ObjectModel.ObservableCollection<WhateverDto>' could be found (are you missing a using directive or an assembly reference?) 如果你将鼠标悬停在有问题的 ReplaceRange 调用上,你不会得到自动包含适当 using 语句的提示。此时,有些人可能会认为他/她做错了什么。然而,实际上并没有,你只需要知道你的扩展方法在哪里,并手动输入方法所在命名空间的 using 语句。在你弄清楚这一点后,你的源代码就可以编译了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接