如何在C#对象中实现动态属性的最佳方法?

3
我有许多类对象,每个对象都需要一个URL字段,该字段始终通过类的另一个属性“TypeId”以相同的方式进行格式化。
最好的方法是将其抽象为动态属性,因此可以根据类中的“TypeId”和“ItemId”属性生成URL字段。
我能想到许多方法来实现这一点,但想知道推荐的做法是什么。
以下是示例:
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; }
}

你是否知道所有类型的ID,或者它们也是动态的?如果你知道它们,这可能意味着子类化是适当的。或者也许你只需要另一个类作为翻译器。 - Anthony Pegram
请求URL时,TypeId和ItemId始终已设置并可用。它们从数据库获取,并且是动态的。 - Nick
4个回答

5

您可以设置一个包含所有已知 TypeIds 和 Func<int, string> 返回 URL 的字典。甚至可以使得新的 TypeIds 和 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 }
        };
}

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; } }
}

这取决于你是否有很多类型,如果这个逻辑有意义或不有意义。
这只是另一种解决方案,但你提供的那个看起来也不错。


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/"; }
    }
}

0

你可以在一个基类中做到这一点,其他类可以继承该基类...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接