2010-12-16 23 views
20
private List<T> newList; 

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

Quiero crear algo como esto, pero esto no funcionará. es solo un ejemplo para demostrar mi objetivo, ya que es bastante común crear propiedades para cadenas e int e incluso T, pero nunca he visto una propiedad de lista ¿Es posible hacer tal cosa, crear una propiedad para el tipo Lista?Cómo crear una propiedad para una lista <T>

EDITAR

tengo una clase normal que tiene propiedades normales (propiedades de cadena, int propiedades, etc) pero tengo esta propiedad que almacena las opciones de usuario, tanto en la capa de presentación que tenía que convertir en una cadena para poder almacenarlos en el Objeto. ¡Ahora es posible tener una propiedad de tipo List para almacenar las multivalues ​​de una manera mejor y más limpia, en lugar de convertir la información en una cadena y luego dividirla y volver a unirla! Gracias = Nuevamente D

Edit2

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

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

He utilizado el código exacto informados pero la propiedad todavía no aparecerá en la instancia del objeto, así que traté de añadir código en el get y set (I ¿Se pregunta por qué los dejó vacíos o significa algo?) y también agregó una variable privada en la clase, ¡pero aún no aparece en las propiedades de la instancia del objeto!

Espero que pueda proporcionar el código exacto para implementar esta propiedad y un código simple que asigna o recupera desde/a una instancia de este objeto de clase Es la primera vez que escucha este KeyValuePair y todos los tutoriales son bonitos simple y no para mi caso, lo siento!

The Last Edit: Después de mucha investigación y la ayuda de Mark Avenius encontré la respuesta perfecta. Espero que todos puedan beneficiarse de esto.

¡AHORA!CÓMO CREAR UNA PROPIEDAD PARA UNA LISTA:

El opciones de clase

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

Los usuarios Clase

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

La capa de presentación

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

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

    Item.Options.Add(userOption); 
+0

@IKashef: buen trabajo; eso es más o menos lo que iba a recomendar. No se arrepienta de hacer preguntas. Es por eso que estamos todos aquí :-) –

+0

@Mark Avenius- Bueno, lo llevé un poco lejos, así que lo mínimo es ser educado =) ... Gracias Mark = D – lKashef

+0

gracias por ayudarme :) --- --- - @IKashef –

Respuesta

24

T debe definirse dentro del alcance i n en el que estás trabajando Por lo tanto, lo que se ha publicado funcionará si su clase es genérico en T:

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

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

De lo contrario, usted tiene que utilizar un tipo definido.

EDIT: Por la petición de @ lKashef, después es cómo tener una propiedad de lista:

private List<int> newList; 

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

Esto puede ir dentro de una clase no genérica.

Edición 2: En respuesta a la segunda pregunta (en su edición), que no recomendaría el uso de una lista de este tipo de manipulación de datos (si te estoy entendiendo correctamente). Me volvería a poner la configuración de usuario en su propia clase (o estructura, si lo desea) y tienen una propiedad de este tipo en su clase 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; } 
} 

esta manera, se han nombrado propiedades que se pueden referenciar en lugar de un índice arbitrario en una lista. Por ejemplo, puede hacer referencia a MySettings.FirstName en comparación con MySettingsList[0].

Deseo saber si tiene más preguntas.

Datos 3: Para la pregunta en los comentarios, su propiedad sería así:

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

EDITAR 4: Sobre la base de edición de la pregunta 2, tras está cómo iba a utilizar este :

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

usted ha mencionado que "la propiedad todavía no aparecerá en la instancia del objeto", y no estoy seguro de lo que quiere decir. ¿Esta propiedad no aparece en IntelliSense?¿Está seguro de haber creado una instancia de MyClass (como myClass.MySettings anterior) o está intentando acceder a ella como una propiedad estática (como MyClass.MySettings)?

+0

@ Mark Avenius- y cuál sería el código si utilizara un tipo definido, digamos int. – lKashef

+0

@IKashef: ver mi edición para más detalles. –

+0

@Mark Avenius- Lo hice, gracias Mark = D – lKashef

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

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

entonces usted puede hacer algo como

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

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

Usted podría hacer esto, pero el parámetro genérico T debe ser declarado en la clase que contiene:

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

Es posible tener una propiedad de tipo List<T> pero su clase necesita pasar el T también.

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

O bien especifique el tipo de T, o si desea hacerlo genérico, deberá hacer que la clase principal sea genérica.

public class MyClass<T> 
{ 
    etc 
0

simple y eficaz alternativa:

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

o

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

Para ver las diferencias de este post: List<Object> vs List<dynamic>

Cuestiones relacionadas