我有这个类和接口:
public class XContainer
{
public List<IXAttribute> Attributes { get; set; }
}
public interface IXAttribute
{
string Name { get; set; }
}
public interface IXAttribute<T> : IXAttribute
{
T Value { get; set; }
}
public class XAttribute<T> : IXAttribute<T>
{
public T Value { get; set; }
}
我需要迭代XContainer.Attributes
并获取属性Value
,但我需要转换IXAttribute
以更正通用表示,例如XAttribute<string>
或XAttribute<int>
但我不喜欢我不想使用if-else if-else语句来检查它,如果XContainerl.Attributes[0] is XAttribute<string>
然后施放......
这是一个更好的方法吗?
答案 0 :(得分:1)
有一种更好的方法。
假设您想要保持当前的整体设计,您可以按如下方式更改非通用接口和实现:
public interface IXAttribute
{
string Name { get; set; }
object GetValue();
}
public class XAttribute<T> : IXAttribute<T>
{
public T Value { get; set; }
public object GetValue()
{
return Value;
}
}
然后你的迭代器只会访问GetValue()
,不需要转换。
那就是说,我认为设计可能不是你所做的最好的。
答案 1 :(得分:0)
您还可以定义通用扩展方法
public static class XAttributeExtensions
{
public T GetValueOrDefault<T>(this IXAttribute attr)
{
var typedAttr = attr as IXAttribute<T>;
if (typedAttr == null) {
return default(T);
}
return typedAttr.Value;
}
}
然后你可以调用它(假设T
是int
)
int value = myAttr.GetValueOrDefault<int>();
将其作为扩展方法实现的原因是它可以与非泛型接口IXAttribute
的任何实现一起使用。