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> 然后投射......

这里有更好的方法吗?

C# 将泛型类型强制转换为正确的类型

有更好的方法可以做到这一点。

假设你想保持当前的整体设计,你可以改变你的非通用接口和实现,如下所示:

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

然后你可以调用它(假设Tint

int value = myAttr.GetValueOrDefault<int>();

将其实现为扩展方法的原因是,它将与非泛型接口的任何实现一起使用IXAttribute