【问题标题】:How can I inform the implementor of my Interface that the "path" parameter represents a folder?如何通知接口的实现者“路径”参数代表一个文件夹?
【发布时间】:2008-11-26 22:30:29
【问题描述】:

我即将在我的应用程序中定义一个接口,插件编写者可以实现该接口以提供用户定义的“导出”功能。它看起来像这样:

public interface IFooExporter
{
    void ExportFoo(Foo foo, string path);
}

但是,我需要让插件编写者知道(明确地,不仅仅是在文档中)“路径”代表一个文件夹,而不是一个文件名。在导出过程中创建文件是他们的责任。

强制路径是文件夹而不是文件名的最佳方法是什么?我现在最好的猜测是使用 DirectoryInfo 而不是字符串:

public interface IFooExporter
{
    void ExportFoo(Foo foo, DirectoryInfo folder);
}

这是一个好的解决方案,还是在传递 DirectoryInfo 实例时存在我不知道的陷阱?

【问题讨论】:

  • 您可以强制他们使用 DirectoryInfo,这不是一件坏事,或者如果您使用字符串并且他们传递了文件名,则抛出 ArgumentException
  • 反过来,蒂莫西。我将把字符串传递给他们(这是给插件作者的)。我想确保他们以不假定字符串代表文件名的方式实现该方法。

标签: .net api extensibility


【解决方案1】:

因为您没有实施该解决方案,所以我同意您使用 DirectoryInfo 作为参数的解决方案。如果您指定一个字符串,则无法阻止任何字符串被传递。

【讨论】:

  • 正强化!我将暂时搁置这个问题,如果没有人提出更好的解决方案或反对 DirectoryInfo 的令人信服的论点,那么我会将其标记为答案并采用该想法。
  • 如果您确实使用 DirectoryInfo 路由,请务必记住您传递的是具有可变属性的对象。
  • 在这种情况下,从 DirectoryInfo 继承的新类,使其只读,也是一种可能性。
  • 我的意思是“记住”,因为当您将字符串发送到某个方法时,它不会在您身上发生变化。将 DirectoryInfo 对象交给插件后,不要依赖它的属性。
  • 是的,好点。因为这将用于自定义导出器,所以我很可能会构造一个 DirectoryInfo 并将其传递进去,并且不再查看它,因此可变性应该不是问题。
【解决方案2】:

使用 XML cmets,它们将显示在 Visual Studio 的 Intellisense 弹出窗口中。

/// <summary>
/// Type in the text you want to appear
/// </summary>

【讨论】:

  • 就像我在问题中所说的那样,我希望这在界面中是明确的 - 而不仅仅是文档。
  • intellisense 中的 cmets 来自具体的实现,而不是接口。
【解决方案3】:

更明确地命名您的变量。它仅仅是一条路径吗?你说不,它不是,但你仍然给它留下一个通用名称。将其命名为 folderPath,这样会减少混乱,也不需要明确地与实施者沟通。

【讨论】:

  • 是的,参数命名是答案的一部分(因此我在 DirectoryInfo 答案中将其重命名为“文件夹”),但我并没有低估潜在加载项编写者的愚蠢!字符串是字符串,可以是任何东西,不管参数名称。
  • 我不明白你为什么需要“强制执行”任何事情。这些实现者在这里实现了某些东西的接收端,不是吗?您的代码不是发送此参数中的值的代码吗?如果不是,那么您的问题对我来说不是很清楚。
  • 是的,我的代码将提供参数。我试图在“强类型”的意义上使它万无一失。如果我传递一个字符串并且执行器决定将其视为文件名,那么他的导出器将崩溃并烧毁。我知道这是他的错,但我想提前防止这种情况发生。
猜你喜欢
  • 2017-05-06
  • 2019-09-08
  • 1970-01-01
  • 1970-01-01
  • 2013-02-09
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 2020-12-19
相关资源
最近更新 更多