我需要概述上下文的一些背景信息。请耐心等待,我会尽量简化我的问题:
我有一个从另一个对象继承的对象。我们将第一个对象称为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);
}
非常感谢任何帮助。感谢。
答案 0 :(得分:5)
由于price
是Fruit
的成员,因此您无需弄清楚子类型。你可以这样做:
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);
}