C#将泛型类型转换为右类型

时间:2012-06-02 14:52:10

标签: c# generics casting

我有这个类和接口:

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>然后施放......

这是一个更好的方法吗?

2 个答案:

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

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

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

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