【问题标题】:How to create a property for a List<T>如何为 List<T> 创建属性
【发布时间】:2011-05-26 15:55:05
【问题描述】:
private List<T> newList;

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

我想创建这样的东西,但这行不通。这只是一个演示我的目标的示例,因为为 string 和 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,所有的教程都很简单,不适合我,对不起!

最后的编辑:经过大量研究和 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);

【问题讨论】:

    标签: c#


    【解决方案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: 对于 cmets 中的问题,您的属性将是这样的:

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

    【讨论】:

    • @Mark Avenius- 如果我使用定义的类型,例如 int,代码会是什么!
    • @Mark Avenius- 我做到了,谢谢 Mark =D
    • @Mark Avenius-我在同一领域有一个小问题-希望您能提供帮助!-请检查我的编辑并告诉我您是否可以提供帮助 =)
    • @Mark Avenius-感谢您的跟进:D...您的解决方案很好,但它不适合我的情况,因为我喜欢一个能够添加新选项的版主页面,并且此选项存储在数据库中(OptionId,Option)并加载到 CheckBoxList 中,我们可以稍后从中选择以将它们中的任何一个分配给用户,因此如果我们添加新选项,它将在我们的类中没有属性如果我们删除了一个选项,那么我们的类将包含一些不必要的数据......这是整个画面,我希望我能让你更容易一些!
    • @IKashef:在这种情况下,您可以将它们放在 Dictionary 类型的属性中(如果您愿意,也可以是 )。如果您需要特别订购它们,您可以使用 List>.
    【解决方案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】:

      简单有效的替代方案:

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

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          可能有List&lt;T&gt; 类型的属性,但您的类也需要传递T

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

          【讨论】:

            【解决方案6】:

            要么指定 T 的类型,要么如果你想让它泛型,你需要让父类泛型。

            public class MyClass<T>
            {
              etc
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2019-07-01
              • 1970-01-01
              • 1970-01-01
              • 2011-10-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多