3

いくつかのクラスオブジェクトがあり、それぞれにTypeId、クラスの別のプロパティであるパラメータを介して常に同じ方法でフォーマットされるURLフィールドが必要です。

これを動的プロパティとして抽象化して、クラスのプロパティTypeIdとプロパティに基づいてURLフィールドを生成するための最良の方法は何ですか。ItemId

私はこれを行うための多くの方法を考えることができますが、推奨される方法は何であるか疑問に思いました。

以下の例:

public class MyObject
{
    public int Id { get; set; }
    public string URL
    {
        get
        {
            if (TypeId == 3)
            {
                return "/do/this/" + ItemId;
            }
            if (TypeId == 5)
            {
                return "/do/that/" + ItemId;
            }
            return "#";
        }
    }
    public int ItemId { get; set; }
    public int TypeId { get; set; }
}
4

4 に答える 4

5

既知のすべてのTypeIdとを使用して辞書を設定しFunc<int, string>、URLを返すことができます。実行時に新しいTypeIdとURLフォーマット関数を追加できるようにすることもできます。

private Dictionary<int, Func<int, string>> _urlFormatters;

public string URL
{
    get { return _urlFormatters[TypeId](ItemId); }
}

// In the constructor or some other init area:
{
    _urlFormatters = new Dictionary<int, Func<int, string>>
        {
            { 3, itemId => "/do/this/" + itemId },
            { 5, itemId => "/do/that/" + itemId }
        };
}
于 2013-01-24T16:25:56.607 に答える
3

さらに一歩進んで、完全なオブジェクトを実装できます。

public abstract class MyObject
{
    public int ItemId { get; set; }
    public virtual string URL { get { return "#"; } }
}
public class MyObjectType3 : MyObject
{
    public override string URL { get { return "/do/this/" + ItemId; } }
}
public class MyObjectType5 : MyObject
{
    public override string URL { get { return "/do/that/" + ItemId; } }
}

このロジックが理にかなっているかどうか、タイプがたくさんあるかどうかによって異なります。
これは単なる別の解決策ですが、あなたが与えるものもうまく見えます。

于 2013-01-24T16:23:36.003 に答える
2
abstract class BaseClass {
    public int ItemId { get; set; }
    public abstract string BaseUrl { get; }
    public string Url {
        get {
            return BaseUrl + ItemId;
        }
    }
}

class Type3 : BaseClass {
    public override string BaseUrl {
        get { return "/do/this/"; }
    }
}

class Type5 : BaseClass {
    public override string BaseUrl {
        get { return "/do/that/"; }
    }
}
于 2013-01-24T16:22:38.003 に答える
0

他のクラスが継承する基本クラスでそれを行うことができます...

于 2013-01-24T16:22:21.937 に答える