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