所以我的问题更多的是关于我应该做什么,而不一定是'如何'实现我正在做的事情。所以,我有这个看起来像这样的静态类:
public static class CanImportFileType
{
static Predicate<string> isSTQFile = f => f.ToLower().EndsWith(".stq") || f.ToLower().EndsWith(".stqt");
static Predicate<string> isAPHFile = f => f.ToLower().EndsWith(".aph");
public static bool IsValidQuoteFilePath(string[] FilePath)
{
bool IsValidQuoteFilePath = false;
if(HasFile(FilePath))
{
if(isSTQFile(FilePath[0]))//we just look at the first index...we could extend this to look through all of the indices and find the first appropriate
{
IsValidQuoteFilePath = true;
}
}
return IsValidQuoteFilePath;
}
public static bool IsValidQuoteFilePath(string FilePath)
{
bool IsValidQuoteFilePath = false;
if (isSTQFile(FilePath))
{
IsValidQuoteFilePath = true;
}
return IsValidQuoteFilePath;
}
public static bool IsValidAPHFilePath(string[] FilePath)
{
bool IsValidQuoteFilePath = false;
if (HasFile(FilePath))
{
if(isAPHFile(FilePath[0]))
{
IsValidQuoteFilePath = true;
}
}
return IsValidQuoteFilePath;
}
public static bool IsValidAPHFilePath(string FilePath)
{
bool IsValidQuoteFilePath = false;
if (isAPHFile(FilePath))
{
IsValidQuoteFilePath = true;
}
return IsValidQuoteFilePath;
}
/// <summary>
/// used only to determine if the string array being passed around is not null or void of any strings (count == 0)
/// </summary>
/// <param name="fileLocation"></param>
/// <returns> whether or not there is a file type in the first index of a string array</returns>
private static bool HasFile(string[] fileLocation)
{
bool hasfile = false;
if (fileLocation != null)
{
if (fileLocation.Count() > 0)
{
hasfile = true;
}
}
return hasfile;
}
}
现在实现这个我会有这样的事情:
string[] foo = {"hello", "world"};
CanImportFileType.IsValidQuoteFilePath(foo) //returns false
或者,我可以通过在方法参数的开头添加一个'this'关键字来扩展string []和字符串类型,如下所示:
public static bool IsValidQuoteFilePath(this string[] FilePath)
{
bool IsValidQuoteFilePath = false;
if(HasFile(FilePath))
{
if(isSTQFile(FilePath[0]))//we just look at the first index...we could extend this to look through all of the indices and find the first appropriate
{
IsValidQuoteFilePath = true;
}
}
return IsValidQuoteFilePath;
}
然后,我要做的就是实现它就像访问那样的字符串IsValidQuoteFilePath方法:
string[] foo = {"hello", "world"};
foo.IsValidQuoteFilePath() //returns false
我想总结一下我的问题:你怎么知道何时只是扩展一个方法而不是创建一个静态助手类?
答案 0 :(得分:2)
您如何知道何时只是扩展方法而不是创建静态助手类?
两者基本相同 - 更多的是你期望和想要使用这些物品。
我的一般经验法则是:这种方法是否会成为每个开发人员(可能)想要在每个 string
或string[]
实例上使用的方法?如果是这样,请考虑扩展方法。如果没有,请使用常规静态方法。
在这种情况下,似乎用例非常狭窄,并且不适合任意string
实例,这将建议一个普通的静态辅助方法。核心内置类型(对象/字符串/等)几乎总是如此,因为一种方法非常适合该类型的所有用途。
另外:请注意,这不是扩展类型,它只是提供了一种不同的语法来访问静态方法。
答案 1 :(得分:0)
在第二种情况下,您不是扩展类型。您的代码无法修改string[]
类型。您只是提供语法糖,使其出现,就像您的方法是实例方法一样。它不是;它仍然是一种静态方法。
两者之间没有真正的功能差异;后者的编译看起来就像前者一样。这完全取决于您使用的个人偏好。