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

c#是否有任何接口或模式可用于选择性地转换某些内容?,c#,C#,假设我有一个表示复杂类型的XElement 现在,XElement可能是一种资产,但可能不是。 其他类型也一样 所以我基本上想要一个 if ( element is Asset ) { Asset asset = element as Asset; } 我认为我不能重载“是”和“作为”,所以我想知道这样做的正常方法是什么?听起来你想要这样的东西: public class Asset { public static bool TryConvert(XElement element

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

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

所以我基本上想要一个

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

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

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

public class Asset
{
    public static bool TryConvert(XElement element, out Asset result)
    {
        ...
    }
}
然后你可以写:

if (Asset.TryConvert(element, out var asset))
{
    // Use asset here
}

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

public class Asset
{
    public static bool TryConvert(XElement element, out Asset result)
    {
        ...
    }
}
然后你可以写:

if (Asset.TryConvert(element, out var asset))
{
    // Use asset here
}
如果您正在谈论的是,那么将
转换为
/
是不可能的,因为您拥有的对象只是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;
    }
}
这与中看到的模式相吻合,它随后成为Daisy答案中提到的
out var
语言功能背后的推动力(或至少是很大一部分)

如果您正在谈论,那么使用
is
/
转换为
将是不可能的,因为您拥有的对象只是一个围绕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;
    }
}

这符合中看到的模式,它随后成为Daisy答案中提到的
out var
语言功能背后的推动力(或至少是其中的一大部分)

如果您使用的是C#7,您可以
如果(元素是资产){}
,这是你正在做的事情的快捷方式…在我看来,你的代码满足了你的要求。
用于检查实际类型,而不是用于用户定义的转换,我想你在说的是。。。您希望如何进行断言转换?你能给我们一个具体的报价吗?(虽然
XElement
不是密封的,但我认为从它创建派生类是很奇怪的。)XElement不是资产。我想有一种方法来解析xElement,并确定它是否作为资产成功解析。因此,这就像覆盖“is”来查看元素是否有标记一样。还需要重载“as”以将xElement实际转换为资产对象。您可以实现用户定义的转换(显式或隐式cast运算符),如果它不是资产,则返回null,但我不会这样做,因为它会破坏正常和预期的c#行为:
var a=(资产)元素
确实应该抛出一个
InvalidCastException
而不是返回null。如果您使用的是C#7,您可以执行
If(元素是资产资产){}
,这是您正在执行的操作的快捷方式…在我看来,您的代码符合您的要求。
,因为
用于检查实际类型,不适用于用户定义的转换,我想你是在说。。。您希望如何进行断言转换?你能给我们一个具体的报价吗?(虽然
XElement
不是密封的,但我认为从它创建派生类是很奇怪的。)XElement不是资产。我想有一种方法来解析xElement,并确定它是否作为资产成功解析。因此,这就像覆盖“is”来查看元素是否有标记一样。还需要重载“as”以将xElement实际转换为资产对象。您可以实现用户定义的转换(显式或隐式cast运算符),如果它不是资产,则返回null,但我不会这样做,因为它会破坏正常和预期的c#行为:
var a=(资产)元素
应该真正抛出一个
InvalidCastException
,而不是返回null。