У меня есть система, с которой я работаю, которая использует делегаты System.Action для обработки событий, но столкнулась с проблемой с несовместимыми типами делегатов и не уверена, какие действия предпринять. Приведенный ниже код является близким приближением к тому, что происходит в исходном коде.
Using System;
//My base data object
public class BasicData{
public bool foo {get; private set;} = false;
public BasicData(bool bData){
foo = bData;
}
}
//One of my extended data objects
public class ComplexData : BasicData{
public string bar {get; private set;} = "";
public ComplexData (bool bData, string strData){
foo = bData;
bar = strData
}
}
//One of the basic things doing work
public class MyThing{
public bool isAwake {get; private set;} = false;
public Action<BasicData> OnDoesStuff;
private BasicData data; //Used internally elsewhere
protected virtual void DoThatStuff() {
data = new BasicData(true);
OnDoesStuff?.Invoke(data);
}
}
//One of the more complex things doing work
public class MyMoreComplexThing : MyThing{
public new Action<ComplexData> OnDoesStuff;
private new ComplexData data; //Used internally elsewhere
protected override void DoThatStuff() {
data = new ComplexData(true, "MMM, Tasty");
OnDoesStuff?.Invoke(data);
}
}
//Excerpt from one of the 'factory-like' managers
public MyFactory{
private List<MyThing> lstThings = new List<MyThing>();
//Generic basic data callback
//Other interested parties add their own data callbacks as needed
public void RegisterBasic(BasicData callback) {
for (int i = 0; i < lstThings.Count; i++) {
if(lstThings[i].isAwake){
lstThings[i].OnDoesStuff += callback;
}
}
}
}
//Excerpt from one of the interested parties
public InterestedParty{
//populated somewhere else during initialization of the party
private List<MyMoreComplexThing > lstComplexThings = new List<MyMoreComplexThing >();
//Complex data callback
public void WhatchaDoing(MyMoreComplexThing callback) {
for (int i = 0; i < lstComplexThings .Count; i++) {
if(lstComplexThings [i].isAwake){
lstComplexThings [i].OnDoesStuff += callback;
}
}
}
}
Назначение делегата проходит компилятор нормально, но не выполняется во время выполнения для RegisterBasi c (), так как он не может разрешить дочерний параметр обратно к его родителю. У меня такое чувство, что мне действительно нужно реорганизовать рефакторинг для добавления, и лучше принять во внимание обратный вызов OnDoesBasicStuff и OnDoesMoreComplexStuff каждый.