C# 方法返回一个ParentClass对象,该对象可以是两种子类类型之一。如何公开ChildClass属性?
根据下面的代码,我有一个GetOrderPreviewSecurity()方法返回一个安全性,它是Stock和MutualFund的父类 GetOrderPreviewSecurity()方法实际上只将股票类型或互惠基金类型返回给安全属性。我遇到的问题是试图访问下面//注释中描述的特定于子级的属性 有没有一种方法可以强制强制转换或清理这个比“var newThing=(ChildClass)SecurityClass;”和使用newThing更干净的方法C# 方法返回一个ParentClass对象,该对象可以是两种子类类型之一。如何公开ChildClass属性?,c#,list,inheritance,parent-child,C#,List,Inheritance,Parent Child,根据下面的代码,我有一个GetOrderPreviewSecurity()方法返回一个安全性,它是Stock和MutualFund的父类 GetOrderPreviewSecurity()方法实际上只将股票类型或互惠基金类型返回给安全属性。我遇到的问题是试图访问下面//注释中描述的特定于子级的属性 有没有一种方法可以强制强制转换或清理这个比“var newThing=(ChildClass)SecurityClass;”和使用newThing更干净的方法 public class Stock :
public class Stock : Security
{
public string Ask;
public string Bid;
}
public class MutualFund : Security
{
public string AssetClass;
public string Category;
}
public Security PreviewSecurity;
public Security GetOrderPreviewSecurity(_orderTickerText){
//Do stuff
if (boolean thing)
return new Stock();
else if (boolean thing)
return new MutualFund();
else
return new Security("empty");
}
//Some stuff
private void ExecutePreviewOrder()
{
if (!string.IsNullOrEmpty(_orderTickerText) && _orderShareQuantity > 0)
{
//Returns a **Security**
PreviewSecurity = _portfolioService.GetOrderPreviewSecurity(_orderTickerText);
if (PreviewSecurity is Stock)
{
//PreviewSecurity is still a Security type.
//No Bid or Ask properties available
PreviewBid = PreviewSecurity.Bid;
PreviewAsk = PreviewSecurity.Ask;
}
else if (PreviewSecurity is MutualFund)
{
//PreviewSecurity is still a Security type.
//No AssetClass or Category propeties available
PreviewAssetClass = PreviewSecurity.AssetClass;
PreviewCategory = PreviewSecurity.Category;
}
}
}
我没有看到任何问题,铸造安全回来,一旦你有类型检查它
if (PreviewSecurity is Stock)
{
PreviewBid = (Stock)PreviewSecurity.Bid;
PreviewAsk = (Stock)PreviewSecurity.Ask;
}
else if (PreviewSecurity is MutualFund)
{
PreviewAssetClass = (MutualFund)PreviewSecurity.AssetClass;
PreviewCategory = (MutualFund)PreviewSecurity.Category;
}
我没有看到任何问题,铸造安全回来,一旦你有类型检查它
if (PreviewSecurity is Stock)
{
PreviewBid = (Stock)PreviewSecurity.Bid;
PreviewAsk = (Stock)PreviewSecurity.Ask;
}
else if (PreviewSecurity is MutualFund)
{
PreviewAssetClass = (MutualFund)PreviewSecurity.AssetClass;
PreviewCategory = (MutualFund)PreviewSecurity.Category;
}
你需要在整件事的周围有一组括号,如下所示:
if (PreviewSecurity is Stock)
{
PreviewBid = ((Stock)PreviewSecurity).Bid;
PreviewAsk = ((Stock)PreviewSecurity).Ask;
}
else if (PreviewSecurity is MutualFund)
{
PreviewAssetClass = ((MutualFund)PreviewSecurity).AssetClass;
PreviewCategory = ((MutualFund)PreviewSecurity).Category;
}
我认为问题在于点的优先级高于强制转换运算符,因此首先应用点运算符,然后将强制转换运算符应用于点运算符返回的任何内容 你需要在整件事的周围放上一组括号,如下所示:
if (PreviewSecurity is Stock)
{
PreviewBid = ((Stock)PreviewSecurity).Bid;
PreviewAsk = ((Stock)PreviewSecurity).Ask;
}
else if (PreviewSecurity is MutualFund)
{
PreviewAssetClass = ((MutualFund)PreviewSecurity).AssetClass;
PreviewCategory = ((MutualFund)PreviewSecurity).Category;
}
我认为问题在于点的优先级高于强制转换运算符,因此首先应用点运算符,然后将强制转换运算符应用于点运算符返回的任何内容 尝试:
PreviewSecurity as Stock
,PreviewSecurity as MutualFund
尝试:PreviewSecurity as Stock
,PreviewSecurity as MutualFund
我同意我认为这也应该行得通。出于某种原因,我的编译器没有它。我忽略了一些括号问题?我同意我认为这也应该有效。由于某种原因,我的编译器没有它。我忽略了一些括号问题?就是这样!非常感谢,成功了!非常感谢。