Подтвердить что ты не робот

Как создать свойство для списка <T>

private List<T> newList;

public List<T> NewList
{
get{return newList;}
set{newList = value;}
}

Я хочу создать что-то подобное, но это не сработает. это просто пример, демонстрирующий мою цель, поскольку это довольно распространенное создание proprties для строки и int и даже T, но я никогда не видел свойство List Возможно ли вообще сделать такую ​​вещь, создав свойство для типа List?

ИЗМЕНИТЬ

У меня есть нормальный класс, который имеет нормальные свойства (свойства строки, свойства int и т.д.), но у меня есть это свойство, которое хранит пользовательские параметры. Поэтому на уровне презентации мне пришлось преобразовать их в строку, чтобы я мог сохраните их в объекте. Теперь возможно иметь свойство типа List для сохранения многозначности лучшим и чистым способом, вместо преобразования информации в одну строку, а затем разделить ее и снова присоединиться к ней! Спасибо снова = D

EDIT2

private List<KeyValuePair<string, string>> _settings;

public List<KeyValuePair<string, string>> MySettings
{
    get { return _settings; }
    set { _settings = value; }
}

Я использовал точный код, который вы отправили, но свойство все еще не появится в экземпляре объекта, поэтому я попытался добавить код в get и set (интересно, почему вы оставили их пустыми или это что-то значит?), а также добавила приватную переменную в класс, но все же она не появляется в свойствах экземпляра объекта!

Надеюсь, вы могли бы предоставить точный код для реализации этого свойства и простой код, который присваивает или извлекает из/экземпляр этого объекта класса Это первый раз, когда можно даже услышать об этом KeyValuePair, и все учебники довольно просты, а не для моего случая, извините!

Последнее редактирование: после многих исследований и помощи Марка Авениуса я нашел прекрасный ответ. надеюсь, что каждый может воспользоваться этим.

СЕЙЧАС! КАК СОЗДАТЬ СОБСТВЕННОСТЬ ДЛЯ СПИСКА:

Класс параметров

Public Class Options
{
        private string id;
        private int option;

        public int ID
        {
            get { return id; }
            set { id= value; }
        }

        public string Option
        {
            get { return option; }
            set { option = value; }
        }
}

Класс пользователей

public class Users

{
        private int userId;
        private string pass;
        private List<Options> userOptions = new List<Options>();


        public int ID
        {
            get { return userId; }
            set { user = userId; }
        }

        public string Pass
        {
            get { return pass; }
            set { pass = value; }
        }

        public List<Options> OptionsList
        {
            get { return userOptions; }
            set { userOptions = value; }
        }
}

Уровень презентации

    Users newUser = new Users ();
    Options userOption = new Options ();

    userOption.ID = int.Parse(txtBxID.Text);
    userOption.Option = txtBxOption.Text;

    Item.Options.Add(userOption);
4b9b3361

Ответ 1

T должен быть определен в пределах области действия, в которой вы работаете. Поэтому то, что вы опубликовали, будет работать, если ваш класс является общим для T:

public class MyClass<T>
{
    private List<T> newList;

    public List<T> NewList
    {
        get{return newList;}
        set{newList = value;}
    }
}

В противном случае вы должны использовать определенный тип.

РЕДАКТИРОВАТЬ: В запросе @lKashef следующим образом: как иметь свойство List:

private List<int> newList;

public List<int> NewList
{
    get{return newList;}
    set{newList = value;}
}

Это может идти в пределах не общего класса.

Изменить 2: В ответ на ваш второй вопрос (в вашем редактировании) я бы не рекомендовал использовать список для такого типа обработки данных (если я правильно понимаю вас). Я бы поставил пользовательские настройки в свой собственный класс (или структуру, если хотите), и у вас есть свойство этого типа в вашем исходном классе:

public class UserSettings
{
 string FirstName { get; set; }
 string LastName { get; set; }
 // etc.
}

public class MyClass
{
 string MyClassProperty1 { get; set; }
 // etc.

 UserSettings MySettings { get; set; }
}

Таким образом, вы назвали свойства, которые вы можете ссылаться вместо произвольного индекса в списке. Например, вы можете ссылаться на MySettings.FirstName, а не на MySettingsList[0].

Сообщите мне, если у вас есть дополнительные вопросы.

ИЗМЕНИТЬ 3: Для вопроса в комментариях ваша собственность будет выглядеть так:

public class MyClass
{
    public List<KeyValuePair<string, string>> MySettings { get; set; } 
}

РЕДАКТИРОВАТЬ 4: Основываясь на вопросе 2, следуйте следующим образом:

public class MyClass
{
    // note that this type of property declaration is called an "Automatic Property" and
    // it means the same thing as you had written (the private backing variable is used behind the scenes, but you don't see it)
    public List<KeyValuePair<string, string> MySettings { get; set; } 
}

public class MyConsumingClass
{
    public void MyMethod
    {
        MyClass myClass = new MyClass();
        myClass.MySettings = new List<KeyValuePair<string, string>>();
        myClass.MySettings.Add(new KeyValuePair<string, string>("SomeKeyValue", "SomeValue"));

        // etc.
    }
}

Вы упомянули, что "свойство все еще не появится в экземпляре объекта", и я не уверен, что вы имеете в виду. Не отображается ли это свойство в IntelliSense? Вы уверены, что создали экземпляр MyClass (например, myClass.MySettings выше), или вы пытаетесь получить к нему доступ как статическое свойство (например, myClass.MySettings)?

Ответ 2

public class MyClass<T>
{
  private List<T> list;

  public List<T> MyList { get { return list; } set { list = value; } }
}

Затем вы можете сделать что-то вроде

MyClass<int> instance1 = new MyClass<int>();
List<int> integers = instance1.MyList;

MyClass<Person> instance2 = new MyClass<Person>();
IEnumerable<Person> persons = instance2.MyList;

Ответ 3

Вы можете сделать это, но общий параметр T должен быть объявлен в содержащем классе:

public class Foo<T>
{
    public List<T> NewList { get; set; }
}

Ответ 4

Возможно иметь свойство типа List<T>, но ваш класс также должен быть передан T.

public class ClassName<T>
{
  public List<T> MyProperty { get; set; }
}

Ответ 5

Либо укажите тип T, либо если вы хотите сделать его общим, вам нужно сделать родительский класс общим.

public class MyClass<T>
{
  etc

Ответ 6

Простая и эффективная альтернатива:

public class ClassName
{
    public List<dynamic> MyProperty { get; set; }
}

или

public class ClassName
{
    public List<object> MyProperty { get; set; }
}

Для отличий см. это сообщение: List <Object> vs List <dynamic>