这个问题是previous question i asked的扩展(已被回答)。我正在重构我的代码,并尝试使用各种重构的解决方案。
我提出的解决方案之一(但不满意......记住,我只是尝试一些个人编码风格)wsa代码如下: -
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
强制转换为多次触发的接口类型?代码有效,但我觉得这是代码味道 - &gt;这不是很有效率。我觉得这可以改进 - 来自任何一个大师的想法吗?
答案 0 :(得分: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")
});
}
答案 1 :(得分:3)
使用as operator获取并投射相同的操作:
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")
});
答案 2 :(得分: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次投射以换取指针。它的眼睛也更容易了!