Member 13846376 Ответов: 2

Каков наилучший способ интанцировать класс сам по себе ?


У меня есть проблема с одним трюком, который я хотел бы попробовать и заставить его работать.

Я хотел бы иметь класс в отдельном файле CS, который уже имеет несколько экземпляров, определенных в нем самом, и список этих экземпляров, доступных для ссылки в Main. Возможно ли это? Должен ли я использовать для этого вложенный класс? Или же, что было бы лучшим способом сделать это?

Если это сработает, мне никогда не придется редактировать этот класс, кроме как добавлять новые экземпляры. Я просто не хочу создавать экземпляр этого класса в Main, потому что я не хочу случайно изменять некоторые значения там, каким-то неправильным щелчком и т. д. Я просто хочу иметь этот класс в отдельном файле и никогда больше не смотреть на него, просто ссылаясь на список, который уже есть.

Что я уже пробовал:

class Parent
{
        private static List<Nested> list_of_instances = new List<Nested>();

        readonly Nested instance1 = new Nested { parameter1=123, parameter2=1234};
        readonly Nested instance2 = new Nested { parameter1=321, parameter2=4321};

        public static List<Nested> List_of_instances
        {
            get { return list_of_instances; }
        }


   class Nested
   {
            public double parameter1 { get; set; }
            public double parameter2 { get; set; }

            public Nested()
            {
                list_of_instances.Add(this);
            }
   }
} 


И в основном я хочу получить список этих экземпляров по умолчанию, как это:

List<double> parameter1_list = new List<double>();
foreach (Parent.Nested item in Parent.List_of_instances)
            {
                parameter1_list.Add(item.parameter1);
            }
            
            ComboBox1.ItemsSource = parameter1_list; 

В XAML у меня есть только простой ComboBox, который я хочу заполнить значениями parameter1 каждого экземпляра класса:
<ComboBox x:Name="ComboBox1"/>

В конце концов, ничего не добавляется в поле со списком, и я не получаю никаких ошибок в этой программе, поэтому я не знаю, с чего начать искать свою ошибку.

Является ли вся эта концепция просто неправильной или это выполнимо? Каков был бы правильный способ заставить это работать?

2 Ответов

Рейтинг:
6

Member 13846376

Ну что ж, я сам отвечу на свой вопрос...

Чтобы создать экземпляр класса в себе, все, что мне нужно было сделать, это добавить ключевое слово "static" для каждого нового экземпляра.

Вот и все. Нет необходимости во вложенных классах.


Afzaal Ahmad Zeeshan

Вы осознаете тот факт, что статика и экземпляр, эти термины, полностью противоположны друг другу.

Кстати, не могли бы вы показать, как вы решили эту проблему?

Member 13846376

Ну, нет, эти термины не являются "полной противоположностью друг другу", это просто две разные вещи. Но я знаю, что вы имеете в виду, когда вы думаете "статический", вы думаете "возможен только один экземпляр", но если вы устанавливаете каждый экземпляр статическим, то каждый из них существует только один раз. Имеет смысл.

    class Class1
        {
            public string Parameter1 { get; set; }
            public double Parameter2 { get; set; }


            public static List<Class1> List_class1 { get; } = new List<Class1>();
            public static List<string> list_parameter1 = new List<string>();


            static Class1 B20 = new Class1 { Parameter1 = "name1", Parameter2 = 20 };
            static Class1 B25 = new Class1 { Parameter1 = "name2", Parameter2 = 25 };


            public Class1()
            {
                List_class1.Add(this);

            }

            public static List<string> Nazwy()
            {
                foreach (Class1 bet in Class1.List_class1)
                {
                    list_parameter1.Add(bet.Parameter1);
                }
                return list_parameter1;
            }
        }
    }

Рейтинг:
2

Ritesh Sahay

Общий подход не очень рекомендуется, но чтобы ответить на ваш вопрос, вам нужно внести определенные изменения в свой код. Ниже приведены изменения, которые вам нужно сделать в вашем родительском классе, которые должны решить вашу проблему.

public class Nested
{
        private static Nested instance1 = new Nested { parameter1 = 123, parameter2 = 1234 };
        private static readonly Nested instance2 = new Nested { parameter1 = 321, parameter2 = 4321 };
        private static List<Nested> list_of_instances = new List<Nested>();
        public static List<Nested> List_of_instances
        {
            get
            {
                if (list_of_instances == null)
                {
                    list_of_instances.Add(instance1);
                    list_of_instances.Add(instance2);
                }
                return list_of_instances;
            }
        }
        public double parameter1 { get; set; }
        public double parameter2 { get; set; }

        private Nested()
        {
            //Private constructor will make sure that no other class able to make instance of this object
        }
}


Теперь вы можете перебирать список экземпляров в основном методе:-

List<double> parameter1_list = new List<double>();
            foreach (Nested item in Nested.List_of_instances)
            {
                parameter1_list.Add(item.parameter1);
            }

            ComboBox1.ItemsSource = parameter1_list;