C# 将泛型类型强制转换为正确的类型
本文关键字:类型 转换 泛型类型 | 更新日期: 2023-09-27 18:36:02
我有这样的类和接口:
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 语句来检查它,就像 if XContainerl.Attributes[0] is XAttribute<string>
然后投射......
这里有更好的方法吗?
有更好的方法可以做到这一点。
假设你想保持当前的整体设计,你可以改变你的非通用接口和实现,如下所示:
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()
,不需要转换。
也就是说,我认为设计可能不是你正在做的事情的最佳选择。
您还可以定义一个泛型扩展方法
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
。