首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C#对象中实现动态属性的最佳方法是什么?

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

Stack Overflow用户
提问于 2013-01-24 16:17:52
回答 4查看 182关注 0票数 3

我有许多类对象,每个类对象都需要一个URL字段,该字段总是通过参数TypeId (该类的另一个属性)以相同的方式格式化。

将其抽象为动态属性的最佳方法是什么,以便根据类中的TypeId和ItemId属性生成URL字段。

我可以想出很多方法来做到这一点,但我想知道推荐的做法是什么。

下面的示例:

代码语言:javascript
复制
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; }
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-01-24 16:25:56

您可以设置一个字典,其中包含所有已知的TypeIds和一个Func<int, string>来返回URL。您甚至可以在运行时添加新的TypeIds和URL格式函数:

代码语言:javascript
复制
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 }
        };
}
票数 5
EN

Stack Overflow用户

发布于 2013-01-24 16:23:36

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

代码语言:javascript
复制
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; } }
}

这取决于你是否有很多类型,这个逻辑是否有意义。

这只是另一种解决方案,但你给出的解决方案看起来也不错。

票数 3
EN

Stack Overflow用户

发布于 2013-01-24 16:22:38

代码语言:javascript
复制
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/"; }
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14505886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档