【问题标题】:How can I pass a value to a child/list object?如何将值传递给子/列表对象?
【发布时间】:2014-02-11 16:43:43
【问题描述】:

我正在尝试使用以下代码将值传递给同一对象的列表。

使用以下代码,我收到“字段初始化程序无法引用非静态字段、方法或属性”错误。

如果我更改姓氏属性来解决这个问题,我会得到另外 2 个错误。

这个想法是创建一个人的对象并将他们的姓氏传递给列表中的孩子。

代码:

public class Person
{
    public Person()
    {
    }

    private string name = "";
    public string Name
    {
        get { return name; }
        set { if (name != value) name = value; }
    }

    private string surname = "";
    public string Surname
    {
        get { return surname; }
        set { if (surname != value) surname = value; }
    }

    private Children sourceList = new Children(Surname);
    public Children SourceList
    {
        get { return sourceList; }
        set { if (sourceList != value) sourceList = value; }
    }
}

[TypeConverter(typeof(TypeConverter))]
public class Children : List<Person>
{
    public Children(string surname)
    {
        this.ForEach(person => { person.Surname = surname; });
    }
}

请帮忙? 提前致谢。

【问题讨论】:

  • 试试private Children sourceList = null;
  • 困惑,鉴于您正在创建一个人,他们如何已经有孩子可以分配姓氏?
  • 顺便说一句:if(sourceList != value) 也不起作用。 (除非你想比较对象的引用)
  • 我们的目标是获取一个现有有孩子的人的列表,并建立一种家谱,而不必为每个孩子重新输入姓氏。
  • 请不要在问题标题中包含有关所用语言的信息,除非没有它就没有意义。标记用于此目的。

标签: c# list object properties propertygrid


【解决方案1】:

此行导致您出现问题:private Children sourceList = new Children(Surname);

原因是字段初始值设定项受限于它们可以访问的内容,c# 规范声明它们不能引用正在创建的实例,因此您可以在字段声明中访问姓氏。

您可以在构造函数中设置属性

【讨论】:

    【解决方案2】:

    从Children类中删除构造函数,并将'foreach语句'放入SourceList集合中,如果没有初始化,则仅在getter中创建一个新的sourcelist。

    就像这样:

      public class Person
        {
            public Person()
            {
            }
    
            private string name = "";
            public string Name
            {
                get { return name; }
                set { if (name != value) name = value; }
            }
    
            private string surname = "";
            public string Surname
            {
                get { return surname; }
                set { if (surname != value) surname = value; }
            }
    
            private Children sourceList;
            public Children SourceList
            {
                get { 
                   if(sourceList == null)
                         sourceList = new Children();
    
                   return sourceList; 
               }
                set { if (sourceList != value) 
                     sourceList = value.ForEach(person => { person.Surname = surname; }); 
                    }
            }
        }
    
            [TypeConverter(typeof(TypeConverter))]
            public class Children : List<Person>
            {
    
            }
    

    【讨论】:

    • 我刚刚测试了这个,这是个好主意,但是在编辑属性网格中的属性时它不会显示父母的姓氏。
    猜你喜欢
    • 2014-06-09
    • 2012-10-28
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 2019-11-15
    • 2013-02-10
    • 1970-01-01
    相关资源
    最近更新 更多