1

私は次のクラスを持っています:

public class Content {
    public int Key { get; set; }
    public int Order { get; set; }
    public string Title { get; set; }
}

IDに応じてコンテンツタイプコードを返す次の関数があります。

protected string getType(string id) {
    switch(id.Substring(2, 2)) {
        case "00": return ("14");
        case "1F": return ("11");
        case "04": return ("10");
        case "05": return ("09");
        default: return ("99");
    }
}

idはコンテンツクラスの一部ではありませんが、クラスと関数は常に一緒に使用されます。

この関数をクラスにきれいに適合させる方法はありますか?私は列挙型か何かを修正することを考えていましたが、C#に関する私の知識は、これをどのように行うことができるかを知るには十分ではありません。誰かが私と模範を示してくれることを願っています。

アップデート:

私は次の提案が好きです:

public static readonly Dictionary<String, String> IdToType = 
    new Dictionary<string, string>
    {
        {"00", "14"},
        {"1F", "11"},
        {"04", "10"},
        {"05", "09"},
        //etc.
    };

しかし、これをクラスにどのように適合させることができるかわかりません。私を見せてくれる人はいますか?私ができるようにしたいのは、次のようなものを書くことです。

Content.getType("00")

提案されたように辞書に保存されたデータ。

4

5 に答える 5

5

これはあなたが探しているものではないかもしれませんが、文字列から文字列への辞書を使用します。

それをクラスの public static メンバーにしたい場合は、それがあなたの求めているものかもしれません。

元:

public static readonly Dictionary<String, String> IdToType = 
    new Dictionary<string, string>
    {
        {"00", "14"},
        {"1F", "11"},
        {"04", "10"},
        {"05", "09"},
        //etc.
    };
于 2012-05-30T13:45:16.477 に答える
2

このようなものをお探しですか?

public class Content
{
    public int Key { get; set; }
    public int Order { get; set; }
    public string Title { get; set; }

    public static string getType(string id)
    {
        switch (id.Substring(2, 2))
        {
            case "00": return ("14");
            case "1F": return ("11");
            case "04": return ("10");
            case "05": return ("09");
            default: return ("99");
        }
    }
}

メソッドは次のように呼び出すことができますContent.getType("00")


余談: C# の慣例によるメソッド名は Pascal ケースにする必要があるため、メソッド名はGetType. お気づきかもしれませんが、既にSystem.ObjectcalledGetTypeにはメソッドがあるので、おそらくもっとわかりやすい名前を付けたいと思うでしょう。

于 2012-05-30T13:39:52.093 に答える
1

列挙型を拡張メソッドと組み合わせる必要があるようです...

例えば

static string Default = "99";
public static readonly Dictionary<string, string> Cache = new Dictionary<string,string>(){
    {"00", "14"},
    {"1F", "11"},
    {"04", "10"},
    {"05", "09"},
    //etc
}
public static getType(Content this){
    if(Cache.ContainsKey(this.typeId)) return Cache[this.typeId];
    else return Default;
}
//Add other types as needed

または、TypeSafe Enum パターンのパターンの例については、この投稿を参照してください: C# String enums

于 2012-05-30T13:54:02.897 に答える
1

文字列と同等のクラスを定義できます...

次に、コンテンツに必要な値で列挙型を定義できます。

次に、文字列、int、または long などを処理するための演算子のオーバーロードを追加できます。

次に、列挙型の演算子のオーバーロードを追加します。

このアプローチでは、ディクショナリは必要なく、次のような Content クラスで const readonly プロパティを宣言するため、実際には列挙型も必要ありません。public static readonly Type0 = "00";

これはタイプ セーフの列挙型パターンを使用するよりも実際には少なくなりますが、類似しており、実際の定数を宣言できるという利点があります。

于 2012-05-30T15:15:49.037 に答える
1

ジェマ、

@DLHの答えを説明するだけです:

public class Content 
{
 public int Key { get; set; }
 public int Order { get; set; }
 public string Title { get; set; }

 public static readonly Dictionary<String, String> getType = 
       new Dictionary<string, string>
 {
     {"00", "14"},
     {"1F", "11"},
     {"04", "10"},
    {"05", "09"},
    //etc.
 };
}

その後、これを行うことができます:

string value = Content.getType["00"];
于 2012-05-30T14:44:11.637 に答える