Как использовать свойства объекта не зная его имя?

Например,есть объекты apple и onion типа food, и у них есть свойство name и есть объекты map и stone тоже со свойством name.
Как мне к ним обратиться к свойству name не зная имени объекта?

Ну можно через dynamic попробовать если точно знаете что свойства есть, либо через Reflection.

А вообще надо более прдметно знать задачу. Может быть есть смысл сделать базовый класс с нужными полями. Либо интерфейс.

1 лайк

Ну вот например, у каждого объекта в моей программе точно есть свойство name. Я хочу получить имя какого-либо объекта, который имеет свойство name

public static food apple = new food("Яблоко", "25", "Обыкновенное спелое яблоко");
        public static food onion = new food("Лук", "30", "Полежавшая луковица, мало кто захочет есть её в сыром виде (Вы думали что здесь будет оружие дальнего боя???)");
        public static other map = new other("Карта", "Старая затёртая карта, надорванная в местах складывания");

public class food
    {
        public string name;
        public string food_value;
        public string description;
        public food(string name, string food_value, string description)
        {
            this.name = name;
            this.food_value = food_value;
            this.description = description;
        }
    }

 public class other
    {
        public string name;
        public string description;
        public other(string name, string description)
        {
            this.name = name;
            this.description = description;
        }

        private void Button8_Click(object sender, EventArgs e)
        { 
                if (BackpackLNames.Contains(.name))    // что можно сделать здесь?
            {
               
                    textBox3.Text = "Вы выбросили " +      // и здесь
                    int x = BackpackLNames.IndexOf(.name);    // и здесь тоже
                    BackpackLNames[x] = empty.name;
                    BackpackLObjects[x] = empty;

А задача-то какая, для чего это? Такое обычно решают наследованием или интерфейсами.

Для упрощения создания программы. Чтобы не прописывать свойство каждого объекта

BackpackLObjects это что, какого типа?

Тут же видимо какой-то инвентарь с разными предметами. Так что логично например создать базовый класс Item и наследовать всё от него.

И непонятно у чего .name получить-то надо. В коде Button8_Click не видно никаких определений “текущего” предмета.

1 лайк

BackpackLObjects это что, какого типа?

        public static List<object> BackpackLNames = new List<object>();
        public static List<object> BackpackLObjects = new List<object>();

В одном списке свойства объектов name, в другом сами объекты

class Food:
{
public string name;
}

class Apple: Food
{
public int NyamNyam = 100;
}


public List<Food> Foods= new List<Food>();

var tmp = new Apple();
tmp.Name = "Абрикос";

Foods.Add(tmp );

И непонятно у чего .name получить-то надо. В коде Button8_Click не видно никаких определений “текущего” предмета.

.name надо получить у объекта, свойство name которого выводится при выборе предмета

Slot1.Text = Convert.ToString(BackpackLNames[0]); //

 private void Slot1_Click(object sender, EventArgs e)
        {
            Button btn = (Button)sender;
            string txt = btn.Text;
            int x = BackpackLNames.IndexOf(txt);

            if (BackpackLObjects[x].GetType() == typeof(emptyClass))
                {
                  textBox3.Text = "Здесь ничего нет";
            }
            
            else if (BackpackLObjects[x].GetType() == typeof(food))
            {
                textBox3.Text = "Вы выбрали " + txt.ToLower();
            }

Так сделайте как я написал и имя будет выводится из каждого объекта.
Не надо никаких списков делать.

BackpackLNames не нужен если имена предметов не повторяются. Можно просто Dictionary. (а если повторяются, то тут тоже странно получится: выбрали яблоко во второй ячейке, а на самом деле взялось первое)

А про то, как сами объекты сделать, выше было же.

class Item
{
    public string Name;
    
    public Item(string name)
    {
        Name = name;
    }
}


class Food : Item
{
    public int Value;
    
    public Food(string name, int value) : base(name)
    {
        Value = value;
    }
}
new Food("Яблоко", 25)
new Food("Лук", 30)
new Item("Карта")

И список/Dictionary объявить с типом Item.

1 лайк

Извините, но я просто отвечал на вопросы и скидывал готовый код