繁体   English   中英

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

[英]What is the best way to implement dynamic property in a C# object?

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

将此抽象为动态属性的最佳方法是什么,因此URL字段是根据类中的TypeIdItemId属性生成的。

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

示例如下:

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

您可以使用所有已知的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 }
        };
}

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM