2014-09-26 45 views
0

如何在使用关键字“as”时将基类数据获取到子类对象中。我尝试了下面的代码,但它返回空数据。“as”关键字在c#中返回空数据

class BaseC 
{ 
    public int BaseId { get; set; } 
    public string BaseName { get; set; } 
} 

class DerivedC: BaseC 
{ 
    public int DerivedId { get; set; } 
    public string DerivedName { get; set; } 
} 
class Program 
{ 
    static void Main(string[] args) 
    { 

     BaseC baseC = new BaseC(); 
     baseC.BaseId = 1; 
     baseC.BaseName = "base class name "; 
     var derivedC = baseC as DerivedC; 
    } 
} 
+7

由于您创建的纯粹的'Basec'不是'DerivedC',所以'as'将返回'null,因为它不能被转换。在C#中不允许向下转换。你想达到什么目的? – 2014-09-26 14:02:47

+0

一个'BaseC'对象并不总是一个'DerivedC'对象(另一种方式是)。您只创建了一个“BaseC”对象而不是“DerivedC”对象。你试图做一个缩小的演员(BaseC到DerivedC),而只有一个扩展演员才能工作(DerivedC到BaseC)。 – Styxxy 2014-09-26 14:04:03

+0

派生的C继承自BaseC,并且您想将BaseC视为DeviedC ...查看问题?另外,为什么使用var? var是一个未定义的类型,例如在linq中使用它 – user28470 2014-09-26 14:04:55

回答

3

这是行不通的。将BaseC替换为AnimalDerivedCCow,您将看到原因。

运行时无法从Animal实例创建Cow,因为缺少信息。这将工作:

BaseC baseC = new DerivedC(); 

因为实例实际上是一个DerivedC

+6

等等,你是不是说每个动物都是牛? :o – Davio 2014-09-26 14:06:02

0

baseC不是DerivedC的实例,所以as运营商将始终返回null

但是它的工作,如果你改变了Main这个第一行:

BaseC baseC = new DerivedC(); 
4

这是正确的 behaivour:

你的代码(简化):

BaseC baseC = new BaseC(); 

// null: result is a BaseC instance and not DerivedC one 
DerivedC result = baseC as DerivedC; 

反向代码(可能是你期望看到的):

BaseC baseC = new DerivedC(); // <- Now, DerivedC instance created 

// not null: result is in fact a DerivedC instance: new DerivedC() 
DerivedC result = baseC as DerivedC; 

// not null: DerivedC is inherired from BaseC 
// and that's why any DerivedC instances are BaseC instances as well 
BaseC result2 = baseC as BaseC; 
0

至于实际的解决方案(也许你已经这样做,你尝试了as关键字之前,但我想我会扔在那里):

如果你有可用的是一个基本实例(并且由于某些原因您无法更改),并且您希望填充派生实例,则可以考虑添加一个接受基类作为参数的构造函数:

class DerivedC : BaseC 
{ 
    public DerivedC() {} // req'd so you can still create an instance without a BaseC 

    public DerivedC(BaseC baseC) 
    { 
     BaseId = baseC.BaseId; 
     BaseName = baseC.BaseName; 
    } 

    public int DerivedId { get; set; } 
    public string DerivedName { get; set; } 
} 

然后调用它像这样:

var derivedC = new DerivedC(baseC); 

至少,减少了重复代码,这样你就不会手动在多个地方分配值。