访问T类C中List <t>的上层属性#

时间:2017-06-08 20:44:43

标签: c# class properties parent

有我的课程:

public class myClass1
{
    public int Code { get; set; }
    public List<myItem> Items { get; set; }
}
public class myClass2
{
    public int Code { get; set; }
    public List<myItem> Items { get; set; }
}
public class myItem
{
    private void MyMethod()
    {
        int ParentClass_CodeProperty = ???
    }
}

如何访问upper(或Parent)类中的(Code属性)?

示例:

string ParentClass_CodeProperty = this.Parent.GetType().GetProperty("Code").GetValue(a, null).ToString()

2 个答案:

答案 0 :(得分:1)

您可以做的一件事是修改您的MyItem类以获得ParentClassCode属性,并通过构造函数设置它:

public class MyItem
{
    public int ParentClassCode { get; set; }

    public MyItem(int parentClassCode)
    {
        ParentClassCode = parentClassCode;
    }
    private void MyMethod()
    {
        // Now we can refer to ParentClassCode
    }
}

然后,您将在创建新MyItem

时设置父类代码
MyClass1 class1 = new MyClass1();
class1.Code = 42;
class1.Items.Add(new MyItem(class1.Code));

在不使用构造函数的情况下执行此操作的另一种方法是在包含类的方法上创建一个方法,该方法应该用于向列表中添加项目,并在AddItem方法中设置属性:< / p>

public class MyClass1
{
    public int Code { get; set; }
    public List<MyItem> Items { get; set; }

    public void AddItem(MyItem item)
    {
        if (item == null) throw new ArgumentNullException();
        item.ParentClassCode = Code;
        Items.Add(item);
    }
}

当然,这意味着还有更多工作要做,以防止用户绕过AddItem方法并致电MyClass1.Items.Add(item);,但您明白了。

答案 1 :(得分:1)

两种可能的解决方案。

第一个解决方案是从类生命周期的开始就在构造函数中传递依赖,就像每个IoC框架一样:

public interface IMyClass
{
    int Code {get;}
}
public class myClass1 : IMyClass
{
    public int Code { get; set; }
    public List<myItem> Items { get; set; }
}
public class myClass2 : IMyClass
{
    public int Code { get; set; }
    public List<myItem> Items { get; set; }
}
public class myItem
{
    //Initialization scope
    private readonly int _parentCode;
    public myItem(IMyClass parent)
    {
       _parentCode = parent.Code;
    }

    //...

    //Execution scope
    private void MyMethod()
    {
        int ParentClass_CodeProperty = _parentCode;
    }
}

第二个解决方案是将依赖注入委托给外部范围,并在实际需要时传递它:

public class myItem
{
    private void MyMethod(IMyClass parent)
    {
        int ParentClass_CodeProperty = parent.Code;
    }
}

//...

//Initialization scope
var _myItemToParentIndex = new Dictionary<myItem, IMyClass>();

var item = new myItem();
var cl = new myClass2();
myClass2.Items.Add(item);
_myItemToParentIndex.Add(item, myClass2);

//...

//Execution scope
item.MyMethod(_myItemToParentIndex[item]);

其他解决方案或多或少相似,例如使用自定义 AddItem RemoveItem 等方法重载 IMyClass 。它们只表示在 myItem 类中注入依赖项的时间。