代码之家  ›  专栏  ›  技术社区  ›  Derek

c#是否有任何接口或模式可用于选择性地转换某些内容?

c#
  •  0
  • Derek  · 技术社区  · 8 年前

    假设我有一个表示复杂类型的XElement。

    现在,XElement可能是一种资产,但可能不是。 其他类型也一样。

    所以我基本上想要

    if ( element is Asset )
    {
       Asset asset = element as Asset;
    }
    

    我认为我不能重载“是”和“是”,所以我想知道这样做的正常方式是什么?

    2 回复  |  直到 8 年前
        1
  •  4
  •   Jon Skeet    8 年前

    听起来你想要这样的东西:

    public class Asset
    {
        public static bool TryConvert(XElement element, out Asset result)
        {
            ...
        }
    }
    

    然后你可以写:

    if (Asset.TryConvert(element, out var asset))
    {
        // Use asset here
    }
    
        2
  •  1
  •   David    8 年前

    如果你说的是 XElement ,然后使用转换 is / as 这是不可能的,因为您拥有的对象只是XML文本的包装器,根据您的问题,它可能(也可能不)表示正确类型的对象。因此,您并不是在寻找转换本身,您真正想要的是 反序列化 。在这种情况下,您可以尝试编写解析器:

    public class Asset
    {
        public static bool TryParse(XElement element, out Asset asset)
        {
            var serializer = new XmlSerializer(typeof(Asset));
            var reader = element.CreateReader();
            var result = serializer.CanDeserialize(reader));
            asset = result
                ? (Asset)serializer.Deserialize(reader)
                : default(Asset);
    
            return result;
        }
    }
    

    这符合 several examples in .NET ,这随后成为 out var Daisy回答中提到的语言特征