如何在方法参数中强制执行特定对象

时间:2016-03-22 04:43:51

标签: c# oop

所以我有一个公共方法,我希望人们使用辅助对象作为参数。该方法实际上是期望一个字符串,但我想强制使用一个由辅助对象专门返回的字符串。

这个例子,第一个参数' 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");

实现这一目标的最佳方法是什么?谢谢!

2 个答案:

答案 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");
}