2

这个问题是对我之前提出的问题的扩展(并得到了回答)。我正在重构我的代码,玩弄/试验各种重构的解决方案。

我想出的解决方案之一(但不满意..记住,我只是在尝试一些个人编码风格)是以下代码:-

if (data is ITagElement)
{
    if (((ITagElement) data).TagList.IsNullOrEmpty())
    {
        ((ITagElement) data).TagList = new List<Tag>();
    }

    ((ITagElement) data).TagList.Add(new Tag
    {
        K = xmlReader.GetAttribute("k"),
         V = xmlReader.GetAttribute("v")
    });
}

请注意我如何将父对象data转换为它多次暗示的接口类型?代码有效,但我觉得这是代码异味-> 效率不高。我觉得可以对此进行改进-那里有任何大师的想法吗?

4

3 回答 3

11

这个怎么样,所以你只做一次演员表:

ITagElement someData = data as ITagElement
if (someData != null)
{
   if (someData.TagList.IsNullOrEmpty())
    {
        someData.TagList = new List<Tag>();
    }

    someData.TagList.Add(new Tag
    {
        K = xmlReader.GetAttribute("k"),
         V = xmlReader.GetAttribute("v")
    });

}
于 2008-12-20T23:57:18.157 回答
3

使用as 运算符获取 is 并在同一个操作中强制转换:

ITagElement tagElement = data as ITagElement;
if (tagElement == null) return;

if (tagElement.TagList.IsNullOrEmpty()) {
   tagElement.TagList = new List<Tag>();
}

tagElement.TagList.Add(new Tag
{
    K = xmlReader.GetAttribute("k"),
    V = xmlReader.GetAttribute("v")
});
于 2008-12-20T23:59:08.077 回答
2

我认为这样会更清楚:

if (data is ITagElement)
{
    ITagElement dataAsTagElement = (ITagElement)data;
    if (dataAsTagElement.TagList.IsNullOrEmpty())
    {
        dataAsTagElement.TagList = new List<Tag>();
    }

    dataAsTagElement.TagList.Add(new Tag
    {
        K = xmlReader.GetAttribute("k"),
        V = xmlReader.GetAttribute("v")
    });
}

这会更好,因为它避免了 3 次强制转换以换取指针。它对眼睛也容易得多!

于 2008-12-20T23:57:54.100 回答