如何为List <t> </t>创建属性

时间:2010-12-16 16:22:39

标签: c#

private List<T> newList;

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

我想创建这样的东西,但这不起作用。这只是一个展示我的目标的例子,因为它很常见的创建字符串和int甚至T的属性但我从未见过List属性 是否可以做这样的事情,为类型List创建一个属性?

修改

我有一个普通的类具有正常的属性(字符串属性,int属性等),但我有这个属性存储用户选项,所以在表示层我必须将它们转换为字符串,所以我能够将它们存储在Object中。现在有可能有一个List类型的属性以更好和更干净的方式存储多值,而不是将信息转换为一个字符串然后拆分它再次加入它!再次感谢= D

EDIT2

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

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

我使用了你发布的确切代码,但是属性仍然不会出现在对象的实例中,所以我尝试在get和set中添加代码(我想知道你为什么把它们留空或者意味着什么?)以及在类中添加了一个私有变量,但它仍未出现在对象实例的属性中!

我希望您能提供实现此属性的确切代码,以及从此类对象的实例分配或检索的简单代码 这是第一次听到这个KeyValuePair并且所有的教程非常简单,不适合我的情况,对不起!

最后的编辑:经过大量的研究和Mark Avenius的帮助,我找到了完美的答案。希望每个人都能从中受益。

立即!如何创建列表的属性:

  

选项类

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

6 个答案:

答案 0 :(得分:30)

必须在您工作的范围内定义

T。因此,如果您的课程在T上是通用的,那么您发布的内容将会有效:

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

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

否则,您必须使用已定义的类型。

编辑: Per @ 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)那样访问它?

答案 1 :(得分:3)

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;

答案 2 :(得分:1)

您可以这样做,但T泛型参数需要在包含类声明:

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

答案 3 :(得分:1)

可以使用List<T>类型的属性,但您的类也需要传递T

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

答案 4 :(得分:1)

简单而有效的替代方案:

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

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

对于差异,请参阅此帖子:List<Object> vs List<dynamic>

答案 5 :(得分:0)

指定T的类型,或者如果要使其成为通用类型,则需要使父类具有通用性。

public class MyClass<T>
{
  etc