在 T class C# 中访问 List<T> 的上层 class 属性

Access upper class property for List<T> in T class C#

有我的 classes:

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 = ???
    }
}

如何访问上层(或父级)中的(代码 属性)class?

示例:

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

你可以做的一件事是修改你的 MyItem class 以获得 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:

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

另一种不使用构造函数的方法是在包含的 class 上创建一个方法,该方法应该用于将项目添加到列表中,并在该 AddItem 方法中, 设置 属性:

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);,还有更多工作要做,但您明白了。

两种可能的解决方案。

第一个解决方案是从 class 生命周期开始就在构造函数中传递依赖关系,就像每个 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]);

其他解决方案或多或少相似,例如使用自定义 AddItemRemoveItem[= 重载 IMyClass 24=] 方法等等。它们只是表示您的依赖项将多早注入 myItem class。