在C#对象中实现动态属性的最佳方法是什么?

在C#对象中实现动态属性的最佳方法是什么?,c#,C#,我有许多类对象,每个类对象都需要一个URL字段,该字段的格式总是通过类的另一个属性parameterTypeId以相同的方式设置 将其抽象为动态属性的最佳方法是什么,以便根据类中的TypeId和ItemId属性生成URL字段 我可以想出很多方法来做到这一点,但我想知道推荐的做法是什么 下面的示例: public class MyObject { public int Id { get; set; } public string URL { get

我有许多类对象,每个类对象都需要一个URL字段,该字段的格式总是通过类的另一个属性parameter
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; }
}

您可以在其他类继承自的基类中执行此操作。

您可以更进一步,实现它的完整对象:

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/"; }
    }
}
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; } }
}
这取决于你是否有很多类型,这个逻辑是否合理。

这只是另一个解决方案,但您提供的解决方案看起来也不错。

您可以设置一个包含所有已知TypeID的字典和一个
Func
来返回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 }
        };
}
private Dictionary\u urlFormatters;
公共字符串URL
{
获取{return _urlFormatters[TypeId](ItemId);}
}
//在构造函数或某些其他初始化区域中:
{
_urlFormatters=新字典
{
{3,itemId=>“/do/this/”+itemId},
{5,itemId=>“/do/that/”+itemId}
};
}

您知道所有的类型ID吗,还是这也是动态的?如果您了解它们,这表明子类化可能是合适的。或者,您可能只是需要另一个类作为转换器。在请求URL时,TypeId和ItemId始终是设置好的,并且是可用的。它们是从数据库中获取的,是动态的。