所以我有一个公共方法,我希望人们使用辅助对象作为参数。该方法实际上是期望一个字符串,但我想强制使用一个由辅助对象专门返回的字符串。
这个例子,第一个参数' qt'期望一个字符串,但我不希望人们传递任何字符串,我希望他们只能传递MyObject.Property(返回一个特定的字符串。)
public string Query(QueryType qt, string artist, string album, string song)
{
// DoStuff
}
QueryType将是一个抽象类,并将具有类似" GetSimilar"," GetTags"等属性。以下是我希望如何使用它的示例:
var json = LastFM.Query(Album.GetSimilar, "Nirvana", "Nevermind");
所以我想避免这样的事情:
var whatever = new Album().GetSimilar;
var json = Query(whatever, "dah","dah","dah");
实现这一目标的最佳方法是什么?谢谢!
答案 0 :(得分:1)
使用"智能枚举模式"像这样:
public sealed class Album
{
public static readonly Album Similiar = new Album("Similiar");
public static readonly Album Tags = new Album("Tags");
public string Value { get; private set; }
private Album(string value)
{
this.Value = value;
}
}
然后用户只能使用您预先定义的Album
值。
public string Query(Album album)
{
//do something
}
答案 1 :(得分:1)
我猜你可以使用枚举。枚举定义了一组可以使用的值,并且仅限于该组值。
如果您希望第一个参数仅为Album.GetSimilar
或其他值,则可以执行此操作
public enum QueryTypeEnum {
AlbumGetSimilar,
AlbumGetSomeOtherStuff,
SomeOtherStuff
}
并将方法更改为接受QueryTypeEnum
。在该方法中,您可以switch
参数并相应地执行操作。
您也可以为其他参数执行此操作:
public enum Artist {...}
public enum Album {...}
public enum Song {...}
您的方法将如下所示:
public string Query(QueryTypeEnum qt, Artist artist, Album album, Song, song) {}
如果您认为代码太多,只要参数错误就抛出ArgumentException
。
if (!CheckArgumentValid(song)) {
throw new ArgumentException("The song is invalid");
}