C#:如何确定一般对象实例的某些对象类型

时间:2010-07-16 17:00:52

标签: c# generics inheritance

我需要概述上下文的一些背景信息。请耐心等待,我会尽量简化我的问题:

我有一个从另一个对象继承的对象。我们将第一个对象称为Fruit,第二个称为Apple。所以我宣布苹果如下:

public class Apple : Fruit
{
    public string appleType;
    public string orchardLocation;
    // etc.
}

Fruit对象如下:

public class Fruit
{
    public int fruitID;
    public int price;
    // etc.
}

所以Apple继承了Fruit。而且我要说我有许多其他水果类型都来自水果:香蕉,橙子,芒果等。

在我的应用程序中,我保持在Session中将特定类型的水果存储为该类型的对象的能力,因此我可能在那里有一个Apple对象或Banana对象。我有一个方法将从会话中检索当前的Fruit,如下所示:

protected Fruit GetModel(int fruitID)
{
   // code to retrieve the fruit from the Session
   // fruitID could be the ID for an Apple or Banana, etc.
}

偶尔,我需要从Session中获取结果,更新一些内容,然后将其上传回Session。我可以这样做:

Apple myApple = (Apple)GetModel(fruitID);
myApple.orchardLocation = "Baugers";
UpdateModel(myApple); // just overwrites the current fruit in the Session

现在我的问题。我需要从Session中提取对象,更新特定于水果本身的东西(比如价格),然后将同一个对象上传回Session。到现在为止,我总是知道对象的类型,所以在我的情况下 - 如果我知道水果类型 - 我可以说:

Apple myApple = (Apple)GetModel(fruitID);
myApple.price = "4";
UpdateModel(myApple);

但是这一次,我试图让它更加通用于水果本身,并不总是知道孩子的类型。如果我试图从Session中拉出Fruit对象(没有强制转换),更新它,然后重新上传,我现在只丢失了我的子对象(Apple)并且在Session中只有一个Fruit对象。所以我需要一种方法,一般来说,在Session中创建一个对象类型的新实例,更新它,然后重新上传。

我知道一个名为GetType()的.NET方法,它返回一个System.Type,它是你调用它的对象类型,假设该对象继承自Object。但是我无法在这方面取得很大进展,而且我宁愿不让Fruit从Object继承。

所以我将以我想要的伪代码版本结束:

public updateModelPrice(int price, fruitID)
{
    FigureOutType fruit = (FigureOutType)GetModel(fruitID);
    fruit.price = price;
    UpdateModel(fruit);
}

非常感谢任何帮助。感谢。

5 个答案:

答案 0 :(得分:5)

由于priceFruit的成员,因此您无需弄清楚子类型。你可以这样做:

public updateModelPrice(int price, fruitID)
{
    Fruit fruit = GetModel(fruitID);
    fruit.price = price;
    UpdateModel(fruit);
}

答案 1 :(得分:1)

一个简单的测试应该这样做

if(obj是Apple)

其中obj是对象而Apple是您正在测试的类型

顺便说一下,你创建的每个类都继承自对象

答案 2 :(得分:0)

如果你不知道它是香蕉还是苹果at run-time你可以用Fruit对象做什么。

Apple myApple = (Apple)GetModel(fruitID);

你必须知道,做苹果对象的任何事都是苹果,所以你必须将Fruit对象转换为Apple类型。

您可以尝试更新UpdateModel方法来处理Fruit类型。

答案 3 :(得分:0)

您可以使用is关键字在运行时确定Fruit的实际类型:

if(fruit is Apple)
    DoAppleStuff();
else if(fruit is Orange)
    Orange o = (Orange)fruit;

// etc

答案 4 :(得分:0)

试试这个:

public void updateFruitModel<T>(int price, int fruitId) where T : Fruit
{
    T fruit = (T)GetModel(fruitId);
    fruit.price = price;
    UpdateModel(fruit);
}