C# 将参数传递给事件侦听器以进行统一切换

C# 将参数传递给事件侦听器以进行统一切换,c#,unity3d,C#,Unity3d,在我的Unity项目中,我基于JSON响应动态创建切换,然后为每个切换添加一个侦听器。现在,每次单击切换,它都会成功调用SomeListener函数。但是,我只能将切换值(true或false)传递给侦听器,理想情况下,我希望能够将切换值和额外参数(student.\u id)传递给侦听器 foreach(var student in students) { GameObject studentObject = (GameObject) Instantiate(StudentAt

在我的Unity项目中,我基于JSON响应动态创建切换,然后为每个切换添加一个侦听器。现在,每次单击切换,它都会成功调用
SomeListener
函数。但是,我只能将切换值(
true
false
)传递给侦听器,理想情况下,我希望能够将切换值和额外参数(
student.\u id
)传递给侦听器

foreach(var student in students) {
        GameObject studentObject = (GameObject) Instantiate(StudentAttendancePreFab, currentPos, transform.rotation);
        studentObject.GetComponent<AttendanceItem> ().studentId = student._id;
        studentObject.GetComponent<Toggle> ().isOn = student.attending;
        studentObject.GetComponent<Toggle> ().onValueChanged.AddListener(SomeListener);


        //is there some way to do this?
        //studentObject.getComponent<Toggle> ().onValueChanged.AddListener(SomeListener, student._id);
}
试一试


这些被称为lambda表达式,您可以找到关于它们的更多信息

不,您不能直接进行,但这里有一种方法。试试下面的方法(我还没有测试过,但你会明白的)。您必须向类型为UnityEngine.Events.UnityAction的学生类声明一个公共字段,以便存储对与学生相关的操作的引用,并在以后需要时删除侦听器

foreach(var student in students) {
        // ..
        string id = student._id ;
        student.listener = MyStudentListener( id ) ;
        studentObject.GetComponent<Toggle> ().onValueChanged.AddListener(student.listener);
}

// ...

private UnityEngine.Events.UnityAction<bool> MyStudentListener( string id )
{
     return (val) => SomeListener( val, id ) ;
}

void SomeListener(bool isClicker, string studentId) {
    // something
}}

但这会丢失布尔值。(x,y)=>doSomething(x,y)
studentObject.GetComponent<Toggle> ().onValueChanged.AddListener((id)=> SomeListener(student._id));
void SomeListener (float id) {
    Debug.Log("Student id?:"+id);
}
foreach(var student in students) {
        // ..
        string id = student._id ;
        student.listener = MyStudentListener( id ) ;
        studentObject.GetComponent<Toggle> ().onValueChanged.AddListener(student.listener);
}

// ...

private UnityEngine.Events.UnityAction<bool> MyStudentListener( string id )
{
     return (val) => SomeListener( val, id ) ;
}

void SomeListener(bool isClicker, string studentId) {
    // something
}}
 student.listener = (val) => SomeListener( val, id ) ;