Como criar uma propriedade para uma lista

private List<T> newList;

public List<T> NewList
{
get{return newList;}
set{newList = value;}
}
Quero criar algo assim, mas isto não vai funcionar. é apenas um exemplo para demonstrar meu objetivo como é muito comum criar proprties para string e int e até T, mas eu nunca vi uma propriedade da lista É sequer possível fazer tal coisa, criando uma propriedade para lista de tipos ?

EDITAR

Eu tenho uma classe normal que tem propriedades normais (propriedades de texto, propriedades int, etc), mas tenho esta propriedade que armazena as opções do utilizador, por isso no camada de apresentação eu tive que convertê-los em uma string para que eu pudesse ser capaz de armazená-los no objeto. Agora é possível ter uma propriedade do tipo lista para armazenar os multivalues de uma maneira melhor e limpa, em vez de converter a informação em uma cadeia e, em seguida, dividi-la e novamente juntá-la! Obrigado Mais Uma Vez.

EDIT2

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

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

usei o código exacto que postaste, mas a propriedade ainda não aparece na instância do objecto, por isso tentei adicionar o código no get e set (I pergunto-me porque os deixaste vazios ou isso significa alguma coisa?) e também adicionou uma variável privada na classe, mas ainda não aparece nas propriedades da instância do objeto!

espero que possa fornecer o código EXACTO para implementar esta propriedade e um código simples que atribui ou recupera de/para uma instância deste objecto de classe É a primeira vez até mesmo ouvir sobre este KeyValuePair e todos os tutoriais são muito simples e não para o meu caso, desculpe!

A Última Edição: Depois de muita pesquisa e da ajuda de Mark Avenius, encontrei a resposta perfeita. espero que todos possam beneficiar disto.

agora! COMO CRIAR UMA PROPRIEDADE PARA UMA LISTA :

A Classe De Opções

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; }
        }
}

A Classe De Utilizadores

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; }
        }
}

A Camada De Apresentação

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

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

    Item.Options.Add(userOption);
 21
c#
Author: lKashef, 2010-12-16

6 answers

T deve ser definido no âmbito em que você está trabalhando. Portanto, o que você postou vai funcionar se a sua classe é genérica em T:

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

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

Caso contrário, terá de usar um tipo definido.

Editar: a pedido de @lKashef, segue-se como ter uma propriedade da lista:

private List<int> newList;

public List<int> NewList
{
    get{return newList;}
    set{newList = value;}
}
Isto pode entrar numa classe não genérica.

Editar 2: Em resposta à sua segunda pergunta( na sua edição), eu não recomendaria usar uma lista para este tipo de tratamento de dados (se eu estou entendendo você corretamente). Eu colocaria as configurações do usuário em sua própria classe (ou struct, se você desejar) e teria uma propriedade deste tipo em sua classe original:

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

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

 UserSettings MySettings { get; set; }
}

Desta forma, você nomeou propriedades que você pode referenciar em vez de um índice arbitrário em uma lista. Por exemplo, você pode referenciar MySettings.FirstName em oposição a MySettingsList[0].

Avise-me se tiver mais perguntas.

Editar 3: Quanto à questão comments, your property would be like this:

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

EDIT 4: baseado na edição 2 da pergunta, segue-se como eu usaria isto:

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.
    }
}
Você mencionou que" a propriedade ainda não aparecerá na instância do objeto", e eu não tenho certeza do que você quer dizer. Esta propriedade não aparece no intelecto? Tem a certeza que criou uma instância de MyClass (como myClass.MySettings acima), ou está a tentar acessá-la como uma propriedade estática (como MyClass.MySettings)?
 25
Author: Mark Avenius, 2010-12-17 18:56:37
public class MyClass<T>
{
  private List<T> list;

  public List<T> MyList { get { return list; } set { list = value; } }
}
Então, podes fazer algo como ...
MyClass<int> instance1 = new MyClass<int>();
List<int> integers = instance1.MyList;

MyClass<Person> instance2 = new MyClass<Person>();
IEnumerable<Person> persons = instance2.MyList;
 3
Author: Rune, 2010-12-16 16:25:31

Pode fazer isto, mas o parâmetro T Genérico tem de ser declarado na classe que contém:

public class Foo<T>
{
    public List<T> NewList { get; set; }
}
 1
Author: Darin Dimitrov, 2010-12-16 16:25:32
É possível ter uma propriedade do tipo List<T> mas a sua classe também precisa de ser passada.
public class ClassName<T>
{
  public List<T> MyProperty { get; set; }
}
 1
Author: Jonathon Bolster, 2010-12-16 16:25:51

Alternativa simples e eficaz:

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

Ou

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

Para as diferenças veja esta publicação: Lista vs lista

 1
Author: Onur Omer, 2017-05-23 11:54:31

Indique o tipo de T, ou se quiser torná-lo Genérico, terá de tornar a classe-mãe genérica.

public class MyClass<T>
{
  etc
 0
Author: devdigital, 2010-12-16 16:27:09