Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 方法返回一个ParentClass对象,该对象可以是两种子类类型之一。如何公开ChildClass属性?_C#_List_Inheritance_Parent Child - Fatal编程技术网

C# 方法返回一个ParentClass对象,该对象可以是两种子类类型之一。如何公开ChildClass属性?

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 :

根据下面的代码,我有一个GetOrderPreviewSecurity()方法返回一个安全性,它是Stock和MutualFund的父类

GetOrderPreviewSecurity()方法实际上只将股票类型或互惠基金类型返回给安全属性。我遇到的问题是试图访问下面//注释中描述的特定于子级的属性

有没有一种方法可以强制强制转换或清理这个比“var newThing=(ChildClass)SecurityClass;”和使用newThing更干净的方法

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
我同意我认为这也应该行得通。出于某种原因,我的编译器没有它。我忽略了一些括号问题?我同意我认为这也应该有效。由于某种原因,我的编译器没有它。我忽略了一些括号问题?就是这样!非常感谢,成功了!非常感谢。