C #: Как определить некоторый тип объекта, как правило, данный экземпляр объекта - PullRequest
0 голосов
/ 16 июля 2010

Мне нужно набросать немного фоновой информации для контекста. Пожалуйста, потерпите меня, и я постараюсь максимально упростить свой вопрос:

У меня есть один объект, который наследуется от другого объекта. Мы назовем первый объект Fruit, а второй Apple. Итак, я объявил Apple следующим образом:

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

И объект Фрукты выглядит следующим образом:

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

Так что Apple наследует от Fruit. И скажем, у меня есть ряд других видов фруктов, которые все наследуют от фруктов: банан, апельсин, манго и т. Д.

В моем приложении я сохраняю возможность хранить фрукты определенного типа в сеансе в качестве объекта этого типа, поэтому у меня может быть объект 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.
}

Иногда мне нужно извлечь фрукт из Сессии, обновить что-то об этом, а затем загрузить его обратно в Сессию. Я могу сделать это так:

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

Теперь мой вопрос. Я нахожусь в точке, где мне нужно извлечь объект из сеанса, обновить что-то определенное для самого фрукта (скажем, цену), а затем загрузить этот же объект обратно в сеанс. До сих пор я всегда знал тип объекта, поэтому в моем случае сейчас - если бы я знал тип фрукта - я мог бы просто сказать:

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

Но на этот раз я пытаюсь сделать его более общим для самого Плода и не всегда знаю тип ребенка. И если я попытаюсь просто вытащить сам объект Fruit из сеанса (без приведения), обновить его и загрузить обратно, я сейчас только что потерял свой дочерний объект (Apple) и в объекте только есть объект Fruit. Поэтому мне нужен способ, как правило, создать новый экземпляр типа объекта в сеансе, обновить его, а затем загрузить его обратно.

Мне известен метод .NET для Object с именем GetType (), который возвращает System.Type того типа объекта, к которому вы его вызываете, при условии, что этот объект наследуется от Object. Но я не смог далеко продвинуться в этом, и я бы предпочел, чтобы Fruit не наследовал от Object.

Итак, я закончу псевдокодовой версией того, что мне нужно:

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

Любая помощь будет принята с благодарностью. Спасибо.

Ответы [ 5 ]

5 голосов
/ 16 июля 2010

Поскольку price является членом Fruit, вам не нужно выяснять подтип.Вы можете просто сделать это:

public updateModelPrice(int price, fruitID)
{
    Fruit fruit = GetModel(fruitID);
    fruit.price = price;
    UpdateModel(fruit);
}
1 голос
/ 16 июля 2010

Простой тест должен это сделать

if (obj - это Apple)

Где obj - это объект, а Apple - тип, который вы тестируете

.каждый созданный вами класс наследуется от объекта

0 голосов
/ 16 июля 2010

Попробуйте это:

public void updateFruitModel<T>(int price, int fruitId) where T : Fruit
{
    T fruit = (T)GetModel(fruitId);
    fruit.price = price;
    UpdateModel(fruit);
}
0 голосов
/ 16 июля 2010

Вы можете использовать ключевое слово is, чтобы определить фактический тип Fruit во время выполнения:

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

// etc
0 голосов
/ 16 июля 2010

Если вы не знаете, банан это или яблоко at run-time, что вы сможете сделать с объектом Fruit.

Apple myApple = (Apple)GetModel(fruitID);

Вы должны знать, что это яблоко, чтобы делать что-либо связанноек объекту Apple, поэтому необходимо привести объект Fruit к типу Apple.

Может быть, вы попытаетесь обновить метод UpdateModel, чтобы он соответствовал типу Fruit.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...