我有许多类对象,每个类对象都需要一个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; }
}发布于 2013-01-24 16:25:56
您可以设置一个字典,其中包含所有已知的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 }
};
}发布于 2013-01-24 16:23:36
您可以更进一步,实现它的完整对象:
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-24 16:22:38
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/"; }
}
}https://stackoverflow.com/questions/14505886
复制相似问题